Chuyển đổi chứng chỉ HTTPS hoạt động như thế nào (như trên suche.org)?


20

Đối với những người không biết Suche.org là gì, đây là một trang web có xếp hạng A + hoàn hảo trên SSL Labs trong mọi danh mục: ( kết quả của Suche.org SSL Labs ). Tôi biết đến trang web này khi tôi mở một vé khác về chứng chỉ ECC không hoạt động trong Chrome và một trong những người trả lời đã sử dụng trang này làm ví dụ.

Điều khiến tôi bối rối là mặc dù Protocol Supportphần báo cáo nói rằng trang web chỉ sử dụng TLSv1.2 ...

TLS 1.2 Yes
TLS 1.1 No
TLS 1.0 No
SSL 3   No
SSL 2   No

Đó rõ ràng không phải là trường hợp vì trong Handshake Simulationphần này, nó hiển thị rằng một số khách hàng cũ được mô phỏng đang sử dụng TLSv1.0 để kết nối ...

Android 4.0.4   EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.1.1   EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.2.2   EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.3     EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.4.2   EC 384 (SHA256)     TLS 1.2 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384   ECDH secp521r1  FS

Đây là một chút bực bội vì nếu tôi tắt TLSv1.0 trên trang web thử nghiệm của mình như vậy ...

# Apache example
SSLProtocol all -SSLv3 -SSLv2 -TLSv1

Chạy quét SSL Labs trên trang web thử nghiệm của tôi mang lại kết quả như sau cho một số khách hàng cũ:

Android 4.0.4   Server closed connection
Android 4.1.1   Server closed connection
Android 4.2.2   Server closed connection
Android 4.3     Server closed connection
Android 4.4.2   EC 384 (SHA256)     TLS 1.2 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256   ECDH secp256r1  FS

Làm thế nào có thể đồng thời chỉ cho phép kết nối TLSv1.2, nhưng cũng hỗ trợ khách hàng cũ?


Chúng ta có nên làm cho tiêu đề chung chung hơn, giống như "logic chuyển đổi chứng chỉ HTTPS" không?
gf_

1
@gf_ Ý kiến ​​hay. Làm xong.
Scott Crooks

Câu trả lời:


17

Tôi khá chắc chắn rằng họ đang kiểm tra các khả năng của khách hàng và hành động tương ứng, như được giải thích trong chuỗi được liên kết đến trong câu trả lời của @Jeff .

Để có được một ý tưởng làm thế nào điều này có thể trông giống như chi tiết, hãy xem cái này . Nó cho thấy một triển khai được thực hiện HAProxyđể phục vụ các khách hàng khác nhau, tùy thuộc vào khả năng của họ. Tôi đã thực hiện sao chép / dán đầy đủ, để ngăn ngừa thối liên kết và vì tôi nghĩ rằng câu hỏi này có thể được quan tâm trong tương lai:

Chứng chỉ SHA-1 đang trên đường ra và bạn nên nâng cấp lên chứng chỉ SHA-256 càng sớm càng tốt ... trừ khi bạn có khách hàng rất cũ và phải duy trì khả năng tương thích SHA-1 trong một thời gian.

Nếu bạn ở trong tình huống này, bạn cần buộc khách hàng của mình nâng cấp (khó khăn) hoặc thực hiện một số dạng logic lựa chọn chứng chỉ: chúng tôi gọi đó là "chuyển đổi chứng chỉ".

Phương pháp lựa chọn xác định nhất là cung cấp chứng chỉ SHA-256 cho các khách hàng có TLS1.2 CLIENT HELLO thông báo rõ ràng sự hỗ trợ của họ đối với SHA256-RSA (0x0401) trong tiện ích mở rộng chữ ký.

phần mở rộng thuật toán chữ ký

Các trình duyệt web hiện đại sẽ gửi phần mở rộng này. Tuy nhiên, tôi không biết về bất kỳ bộ cân bằng tải nguồn mở nào hiện có thể kiểm tra nội dung của phần mở rộng chữ ký. Nó có thể đến trong tương lai, nhưng bây giờ cách dễ nhất để đạt được chuyển đổi chứng chỉ là sử dụng HAProxy SNI ACLs: nếu khách hàng trình bày tiện ích mở rộng SNI, hãy chuyển hướng đến phần phụ trợ có chứng chỉ SHA-256. Nếu nó không xuất hiện tiện ích mở rộng, giả sử rằng đó là một ứng dụng khách cũ nói SSLv3 hoặc một số phiên bản bị hỏng của TLS và xuất trình chứng nhận SHA-1.

Điều này có thể đạt được trong HAProxy bằng cách xâu chuỗi frontend và backends:

Chuyển đổi chứng chỉ HAProxy

global
        ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128
-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-R
SA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

frontend https-in
        bind 0.0.0.0:443
        mode tcp
        tcp-request inspect-delay 5s
        tcp-request content accept if { req_ssl_hello_type 1 }
        use_backend jve_https if { req.ssl_sni -i jve.linuxwall.info }

        # fallback to backward compatible sha1
        default_backend jve_https_sha1

backend jve_https
        mode tcp
        server jve_https 127.0.0.1:1665
frontend jve_https
        bind 127.0.0.1:1665 ssl no-sslv3 no-tlsv10 crt /etc/haproxy/certs/jve_sha256.pem tfo
        mode http
        option forwardfor
        use_backend jve

backend jve_https_sha1
        mode tcp
        server jve_https 127.0.0.1:1667
frontend jve_https_sha1
        bind 127.0.0.1:1667 ssl crt /etc/haproxy/certs/jve_sha1.pem tfo ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
        mode http
        option forwardfor
        use_backend jve

backend jve
        rspadd Strict-Transport-Security:\ max-age=15768000
        server jve 172.16.0.6:80 maxconn 128

Cấu hình ở trên nhận được lưu lượng truy cập trong giao diện được gọi là "https-in". Giao diện đó ở chế độ TCP và kiểm tra CLIENT HELLO đến từ máy khách để biết giá trị của tiện ích mở rộng SNI. Nếu giá trị đó tồn tại và phù hợp với trang đích của chúng tôi, nó sẽ gửi kết nối đến phần phụ trợ có tên "jve_https", chuyển hướng đến một frontend cũng có tên là "jve_https" nơi chứng chỉ SHA256 được cấu hình và phục vụ cho máy khách.

Nếu khách hàng không trình bày CLIENT HELLO với SNI hoặc trình bày SNI không phù hợp với trang web mục tiêu của chúng tôi, thì nó được chuyển hướng đến phụ trợ "https_jve_sha1", sau đó đến giao diện tương ứng của nó nơi chứng chỉ SHA1 được cung cấp. Frontend đó cũng hỗ trợ một ciphersuite cũ hơn để chứa các khách hàng cũ.

Cả hai frontend cuối cùng chuyển hướng đến một phụ trợ duy nhất có tên là "jve" để gửi lưu lượng truy cập đến các máy chủ web đích.

Đây là một cấu hình rất đơn giản và cuối cùng nó có thể được cải thiện bằng cách sử dụng ACL tốt hơn (HAproxy thường xuyên thêm tin tức), nhưng đối với cấu hình chuyển đổi chứng chỉ cơ bản, nó đã hoàn thành công việc!


9

Một câu hỏi tương tự đã được hỏi tại https://community.qualys.com/thread/16387

Tôi nghĩ rằng đây câu trả lời là giải pháp:

suche.org là một thực hiện thông minh. Theo tôi hiểu, nó truy vấn các khả năng của khách hàng và sau đó chỉ cung cấp những thứ tốt nhất hiện có, để loại bỏ mọi nghi ngờ.


2
"Nó truy vấn khả năng của khách hàng", mặc dù không chính xác là một mô tả hữu ích. Hầu như không có đủ thông tin cho bất cứ ai khác để thực hiện riêng của họ.
womble
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.