Nâng cấp kết nối HTTP lên SSL / TLS


8

Tôi hiện có một máy chủ tự động chuyển hướng tất cả các yêu cầu HTTP đến trang web HTTPS tương đương. Vấn đề là có vẻ như một số trình duyệt không chấp nhận chứng chỉ SSL (StartSSL.com) hoặc không hỗ trợ SNI, do đó họ nhận được cảnh báo Chứng chỉ và người dùng sẽ không tiếp tục lướt trên trang web.

Có cơ chế nào cố gắng làm cho trình duyệt sử dụng HTTPS thay vì HTTP đơn giản và khi nó không hoạt động (ví dụ: chứng chỉ không được chấp nhận hoặc SNI không được hỗ trợ), nó tiếp tục sử dụng HTTP.

Hiện tại tôi đang sử dụng Apache 2.4 với nhiều máy chủ ảo, tất cả đều chuyển hướng kết nối HTTP Redirect / https://domain.example/.


3
Thay đổi từ HTTPS sang HTTP khi chứng chỉ không chính xác, đó là điều bạn không bao giờ muốn xảy ra với tư cách là khách truy cập. Thực tế là một chứng chỉ không chính xác phải là một dấu hiệu sai, trở lại kết nối không được mã hóa là điều tồi tệ nhất bạn có thể làm sau đó. Giải pháp tốt nhất bạn có là sửa chứng chỉ của mình sao cho phù hợp với tên máy chủ của bạn, bằng cách sử dụng CA khác hoặc không sử dụng SNI.
Teun Vink

OK đã nhận nó. Nhưng khi chúng tôi mong đợi có một trình duyệt không hỗ trợ kết nối HTTPS hoặc không hỗ trợ các cơ chế mã hóa được cung cấp từ máy chủ. Sau đó, khách hàng đó (trong trường hợp của tôi) không có khả năng sử dụng trang web, vì tôi tự động chuyển hướng đến trang web tương đương HTTPS.
foxylion

Trong thế giới ngày nay, hoàn toàn có thể vượt qua giới hạn này. Các trang web rất lớn chỉ chuyển sang SSL. Nếu họ có thể làm điều đó, bạn có thể làm điều đó.
MichelZ

Câu trả lời:


15

Trình duyệt không bao giờ tự hạ cấp xuống http nếu https không hoạt động, bởi vì tất cả những kẻ tấn công cần làm là làm cho https không khả dụng (ví dụ: chặn cổng 443). Vì vậy, cách duy nhất có thể được thực hiện là bằng cách hướng dẫn trình duyệt từ máy chủ thực hiện điều đó, ví dụ bằng cách gửi chuyển hướng http. Tất nhiên điều này nên được gửi qua một kết nối an toàn (nếu không, một người trung gian có thể giả mạo nó) nhưng thật không may, đó chính xác là vấn đề của bạn khi kết nối an toàn bị lỗi.

Tóm lại: Không, không thể và nó tốt hơn theo cách này.

BTW, tất cả các trình duyệt hiện đại đều hỗ trợ SNI, nhưng không phải tất cả các ứng dụng (ví dụ: ứng dụng Java, v.v.) đều làm được. Nếu bạn có nhiều tên miền trên máy chủ web nhưng chỉ cần một tên miền duy nhất cho các ứng dụng này, bạn có thể đặt chứng chỉ cho tên miền này làm mặc định. Nếu không, bạn sẽ cần phải có một chứng chỉ (đắt hơn) có chứa tất cả các tên miền cần thiết làm tên thay thế chủ đề.

Chỉnh sửa với một ý tưởng khác: những gì bạn có thể cố gắng làm là tải xuống một hình ảnh từ phía bạn dưới dạng https và kiểm tra sự thành công với trình xử lý onerror trên thẻ img. Có thể điều này không kích hoạt cảnh báo người dùng có thể nhìn thấy mà thay vào đó chỉ là không tải được. Và nếu thành công, bạn biết rằng có thể truy cập https và chuyển hướng người dùng.

Ngoài ra, bạn phải tự hỏi mình, tại sao bạn lại muốn cung cấp https, nếu bạn cũng chấp nhận quyền truy cập bằng http. Có những dữ liệu cần được bảo vệ hoặc không. Miễn là bạn cung cấp dự phòng cho http, kẻ tấn công sẽ dễ dàng thực thi http thay vì https.


1
Rất tốt nêu.
Tim Brigham

3

Trước hết, có thể chỉ định một chứng chỉ để sử dụng cho tất cả các khách hàng thiếu hỗ trợ SNI. Điều này có nghĩa là tất cả các tên miền được lưu trữ trên địa chỉ IP đó, bạn có thể có ít nhất một trong số chúng làm việc cho khách hàng mà không có SNI.

Những gì bạn có thể làm khi chuyển hướng từ http sang https là chuyển hướng hai giai đoạn. Chuyển hướng đầu tiên từ http sang https sử dụng tên miền mà bạn đảm bảo sẽ hoạt động có hoặc không có hỗ trợ SNI. URL gốc đầy đủ sẽ phải được bao gồm, như vậy từ trang web https này, bạn có thể chuyển hướng đến một URL thích hợp sau đó.

Tên miền hoạt động có hoặc không có SNI có thể hoạt động khác nhau tùy thuộc vào việc SNI có được máy khách hỗ trợ hay không. Bằng cách đó, bạn sẽ biết khách hàng đã hỗ trợ SNI trước khi bạn chuyển hướng nó đến một miền, yêu cầu SNI.

Làm thế nào chính xác để cấu hình cái này trên Apache sẽ là một chút đoán từ phía tôi (vì tôi chưa bao giờ cấu hình Apache với nhiều hơn một chứng chỉ). Tôi đoán cách để làm điều đó là tạo các máy chủ ảo dựa trên tên cho tất cả các miền bao gồm cả miền trung gian.

Sau đó, tạo một máy chủ ảo mặc định cho các máy khách không có SNI, sử dụng cùng một chứng chỉ với máy chủ sử dụng tên. Hai máy chủ ảo có chứng chỉ giống hệt nhau, sẽ gửi chuyển hướng khác nhau đến các máy khách tùy thuộc vào việc chúng có hỗ trợ SNI hay không.

Cuối cùng, tôi sẽ kích hoạt IPv6 trên máy chủ. Với IPv6, bạn có đủ địa chỉ IP để bạn có thể phân bổ một địa chỉ cho mỗi máy chủ ảo. Cùng một bộ máy chủ ảo có thể được đặt tên dựa trên IPv4 và IP dựa trên IPv6, vì vậy bạn không phải sao chép bất kỳ cấu hình nào theo cách này.

Kết quả cuối cùng sẽ là một thiết lập hoạt động miễn là máy khách hỗ trợ SNI hoặc IPv6. Chỉ những khách hàng không hỗ trợ mới gặp sự cố, nhưng bạn vẫn có thể phát hiện những máy chủ đó và máy chủ chuyển hướng khác hoặc thông báo lỗi.

Đối với các khách hàng không thích CA, đề nghị duy nhất của tôi là nhận ra họ bởi tác nhân người dùng của họ và xử lý họ như thế nào bạn có vẻ phù hợp. Hãy chắc chắn rằng bạn có một liên kết đến trang web https, nơi họ có thể nhấp vào trong trường hợp bạn do nhầm lẫn bao gồm quá nhiều khách hàng.


0

Chỉ là một phỏng đoán hoang dã: Có thể là bạn không có lệnh SSLCertertChainFile trong cấu hình apache của bạn, bao gồm tệp sub.class1.server.ca.pem bạn cần cho StartSSL?


Không, mọi thứ đều hoạt động tốt, nhưng một số trình duyệt cũ không hỗ trợ SNI hoặc không tin tưởng StartSSL.com. Vấn đề là những khách truy cập này không có thái độ tích cực để xem trang mà không bỏ qua cảnh báo chứng chỉ (không có giải pháp nào).
foxylion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.