Tôi có thể phát hiện nếu máy khách SSL không hỗ trợ Chỉ định Tên Máy chủ và cung cấp trang web HTTP tiêu chuẩn trong trường hợp đó không?


8

Tôi sẽ cần sử dụng SSL SNI, nhưng thật không may từ một blog blog Cloudflare gần đây chỉ có 90% mạng hỗ trợ nó. Làm cách nào tôi có thể (ví dụ, với nginx) phát hiện nếu máy khách hỗ trợ SNI và cung cấp / chuyển hướng đến phiên bản HTTP của trang web? Điều này có thể không? Làm thế nào khác tôi không thể mất 10% lưu lượng truy cập bằng SNI? Có đúng không khi cho rằng tôi sẽ không thể chuyển hướng lưu lượng HTTPS sang HTTP mà không có chứng chỉ hợp lệ và do đó yêu cầu này là không thể?

Cảm ơn bạn.


Một câu hỏi liên quan chặt chẽ đã được đặt ra ở đây: Chuyển hướng sang SSL chỉ khi trình duyệt hỗ trợ SNI
Simon East

Câu trả lời:


10

Nếu bạn muốn cung cấp HTTPS từ đầu, bạn phải cung cấp chứng chỉ được khách hàng chấp nhận từ đầu. Bởi vì nếu không, máy khách sẽ không chấp nhận kết nối SSL và bạn sẽ không thể chuyển hướng máy khách đến một trang web khác hoặc phiên bản chỉ có HTTP. Điều này có nghĩa là để hỗ trợ trường hợp này bạn

  • hoặc cần phải có một chứng chỉ duy nhất chứa tất cả các tên miền của bạn, để bạn có thể cung cấp cho các khách hàng không phải SNI một chứng chỉ phù hợp. Nhưng trong trường hợp này bạn không cần SNI chút nào.
  • hoặc bạn phải cài đặt một số chứng chỉ mặc định không khớp với hầu hết tên của bạn. Trong trường hợp này, bạn chỉ có thể cung cấp cho khách hàng một trang khác hoặc chuyển hướng nó nếu khách hàng chấp nhận chứng chỉ xấu này.

Nếu bạn không cần phải có HTTPS từ đầu, đó là nếu máy khách thường kết nối trước với HTTP đơn giản, thì bạn có thể thử phát hiện hỗ trợ SNI để bạn có thể chuyển hướng máy khách sau. Điều này có thể được thực hiện bằng cách bao gồm một hình ảnh, một số JavaScript hoặc nội dung tương tự từ trang web HTTPS của bạn và nếu quá trình tải thành công thì bạn biết rằng máy khách hỗ trợ SNI hoặc bỏ qua lỗi chứng chỉ.

Tất nhiên, điều này khiến mọi thứ mở ra cho các cuộc tấn công trung gian, bởi vì tất cả những người trung gian phải làm là phục vụ một số chứng chỉ khác nhau hoặc làm cho HTTPS không có sẵn, vì trong trường hợp này bạn sẽ không bao giờ thử để nâng cấp kết nối lên HTTPS. Ngoài ra, điều này có thể được sử dụng để làm cho nó trông giống như các máy khách hỗ trợ SNI, nếu người trung gian thực hiện thay thế. Và không chỉ các khách hàng không phải SNI bị ảnh hưởng bởi điều này mà các khách hàng có khả năng SNI chỉ có thể bị chặn. Vì vậy, trong khi điều này có thể là lý thuyết thì không nên vì bạn có thể đơn giản là người trung gian mọi thứ và do đó làm cho điểm chính của việc sử dụng HTTPS moot.


0

Như tôi đã đăng trên StackOverflow , bạn chỉ có thể kiểm tra hỗ trợ SNI trước khi yêu cầu. Đó là, bạn không thể ép buộc người dùng vào SNI HTTPS và sau đó quay lại nếu họ không hỗ trợ, vì họ sẽ nhận được một lỗi như thế này (từ Chrome trên Windows XP) mà không có cách nào để tiếp tục.

Vì vậy, thật không may, người dùng phải thực sự bắt đầu qua kết nối HTTP không an toàn và sau đó chỉ được nâng cấp nếu họ hỗ trợ SNI.

Bạn có thể phát hiện hỗ trợ SNI thông qua:

  1. Tập lệnh từ xa
    Từ trang HTTP đơn giản của bạn, tải a <script>từ máy chủ SNI HTTPS đích của bạn và nếu tập lệnh tải và chạy chính xác, bạn biết trình duyệt hỗ trợ SNI.

  2. AJAX tên miền chéo (CORS)
    Tương tự như tùy chọn 1, bạn có thể thử thực hiện yêu cầu AJAX tên miền chéo từ trang HTTP đến HTTPS, nhưng lưu ý rằng CORS chỉ hỗ trợ trình duyệt hạn chế .

  3. Đánh hơi tác nhân người dùng
    Đây có lẽ là phương pháp ít tin cậy nhất và bạn sẽ cần phải quyết định giữa việc có một danh sách đen các trình duyệt (và hệ điều hành) được biết là không hỗ trợ nó hay danh sách trắng các hệ thống đã biết.

    Chúng tôi biết rằng tất cả các phiên bản IE, Chrome & Opera trên Windows XP trở xuống không hỗ trợ SNI. Xem CanIUse.com để biết danh sách đầy đủ các trình duyệt được hỗ trợ .

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.