HTTPS सर्टिफिकेट स्विचिंग का काम कैसे करता है (जैसे suche.org पर)?


20

उन लोगों के लिए जो यह नहीं जानते हैं कि सुचेई डॉट ओआरजी क्या है, यह एक ऐसी वेबसाइट है, जिसमें हर श्रेणी में एसएसएल लैब्स पर एक सही ए + रेटिंग है: ( सुचेओ एसएसएल लैब्स परिणाम )। मुझे इस वेबसाइट के बारे में तब पता चला जब मैंने क्रोम में काम नहीं कर रहे ईसीसी प्रमाणपत्रों के बारे में एक और टिकट खोला , और उत्तरदाताओं में से एक ने उदाहरण के रूप में साइट का उपयोग किया।

मुझे क्या भ्रमित करता है, हालांकि Protocol Supportरिपोर्ट का खंड कहता है कि वेबसाइट केवल TLSv1.2 का उपयोग करती है ...

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

यह स्पष्ट रूप से मामला नहीं है क्योंकि इस Handshake Simulationधारा के तहत , यह प्रदर्शित करता है कि कुछ पुराने ग्राहकों को जोड़ने के लिए TLSv1.0 का उपयोग किया जा रहा है ...

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

यह थोड़ा निराश करने वाला है क्योंकि अगर मैं अपनी परीक्षा की वेबसाइट पर TLSv1.0 को अक्षम करता हूं, तो ...

# Apache example
SSLProtocol all -SSLv3 -SSLv2 -TLSv1

मेरी परीक्षण वेबसाइट पर एसएसएल लैब्स स्कैन चलाने से कुछ पुराने ग्राहकों के लिए निम्नलिखित मिलते हैं:

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

एक साथ केवल TLSv1.2 कनेक्शन की अनुमति देना कैसे संभव है, फिर भी पुराने ग्राहकों का समर्थन करें?


क्या हमें शीर्षक को अधिक सामान्य बनाना चाहिए, जैसे "HTTPS सर्टिफिकेट स्विचिंग लॉजिक"?
gf_

1
@gf_ अच्छा विचार है। किया हुआ।
स्कॉट क्रुक्स

जवाबों:


17

मुझे पूरा यकीन है कि वे ग्राहक क्षमताओं की जाँच कर रहे हैं और तदनुसार कार्य कर रहे हैं, जैसा कि @Jeff के उत्तर में जुड़े धागे में बताया गया है ।

एक विचार प्राप्त करने के लिए कि यह विस्तार से कैसे दिख सकता है, इस पर एक नज़र डालें । यह HAProxyअलग-अलग ग्राहकों को उनकी क्षमताओं के आधार पर अलग-अलग समारोहों की सेवा के लिए किए गए कार्यान्वयन को दिखाता है। मैंने लिंक रोट को रोकने के लिए एक पूर्ण प्रतिलिपि / पेस्ट किया है, और क्योंकि मुझे लगता है कि यह प्रश्न भविष्य में रुचि का हो सकता है:

SHA-1 प्रमाणपत्र अपने रास्ते से बाहर हैं, और आपको जल्द से जल्द SHA-256 प्रमाणपत्र को अपग्रेड करना चाहिए ... जब तक कि आपके पास बहुत पुराने ग्राहक नहीं हैं और थोड़ी देर के लिए SHA-1 संगतता बनाए रखना चाहिए।

यदि आप इस स्थिति में हैं, तो आपको अपने ग्राहकों को प्रमाणपत्र चयन तर्क के कुछ प्रकार को अपग्रेड (मुश्किल) करने या लागू करने के लिए बाध्य करने की आवश्यकता है: हम कहते हैं कि "सर्टिफिकेट स्विचिंग"।

सबसे नियतात्मक चयन विधि ग्राहकों को SHA-256 प्रमाणपत्र प्रदान करना है जो TLS1.2 CLIENT HELLO को प्रस्तुत करता है जो हस्ताक्षर_ एल्गोरिथम एक्सटेंशन में SHA256-RSA (0x0401) के लिए स्पष्ट रूप से अपने समर्थन की घोषणा करता है।

हस्ताक्षर एल्गोरिथ्म एक्सटेंशन

आधुनिक वेब ब्राउज़र इस एक्सटेंशन को भेजेंगे। हालाँकि, मुझे किसी भी ओपन सोर्स लोड बैलेंसर के बारे में जानकारी नहीं है जो वर्तमान में सिग्नेचर_अलगोरिथम एक्सटेंशन की सामग्री का निरीक्षण करने में सक्षम है। यह भविष्य में आ सकता है, लेकिन अब प्रमाणित स्विचिंग प्राप्त करने का सबसे आसान तरीका है HAProxy SNI ACLs का उपयोग करना: यदि कोई ग्राहक SNI एक्सटेंशन प्रस्तुत करता है, तो उसे एक बैकएंड पर निर्देशित करें जो SHA-256 प्रमाणपत्र प्रस्तुत करता है। यदि यह एक्सटेंशन प्रस्तुत नहीं करता है, तो मान लें कि यह एक पुराना क्लाइंट है जो एसएसएलवी 3 या टीएलएस के कुछ टूटे हुए संस्करण को बोलता है, और इसे SHA-1 प्रमाणपत्र प्रस्तुत करता है।

यह फ्रंट और बैकएंड का पीछा करते हुए HAProxy में प्राप्त किया जा सकता है:

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

उपरोक्त कॉन्फ़िगरेशन "https-in" नामक दृश्यपटल में इनबाउंड ट्रैफ़िक प्राप्त करता है। वह सीमांत TCP मोड में है और SNI एक्सटेंशन के मान के लिए क्लाइंट से आने वाले CLIENT HELLO का निरीक्षण करता है। यदि वह मान मौजूद है और हमारी लक्षित साइट से मेल खाता है, तो यह "jve_https" नाम के बैकएंड से कनेक्शन भेजता है, जो "jve_https" नाम के एक फ्रंटेंड पर पुनर्निर्देशित करता है जहां SHA256 प्रमाणपत्र क्लाइंट को कॉन्फ़िगर और सेवा किया जाता है।

यदि ग्राहक SNI के साथ CLIENT HELLO प्रस्तुत करने में विफल रहता है, या एक SNI प्रस्तुत करता है जो हमारी लक्षित साइट से मेल नहीं खाता है, तो इसे "https_jve_sha1" बैकएंड पर रीडायरेक्ट किया जाता है, फिर इसके संबंधित फ्रंट में जहां SHA1 प्रमाणपत्र दिया जाता है। यह दृश्यपटल पुराने ग्राहकों को समायोजित करने के लिए एक पुराने सिफरसुइट का भी समर्थन करता है।

दोनों फ्रंट अंततः "jve" नामक एकल बैकएंड पर पुनर्निर्देशित करते हैं जो गंतव्य वेब सर्वर को ट्रैफ़िक भेजता है।

यह एक बहुत ही सरल कॉन्फ़िगरेशन है, और अंततः बेहतर ACL (HAproxy नियमित रूप से समाचार जोड़ता है) का उपयोग करके इसे बेहतर बनाया जा सकता है, लेकिन एक बुनियादी प्रमाणित स्विचिंग कॉन्फ़िगरेशन के लिए, यह काम पूरा कर लेता है!


9

Https://community.qualys.com/thread/16387 पर एक समान प्रश्न पूछा गया था

मुझे लगता है कि यह उत्तर समाधान है:

suche.org एक चतुर कार्यान्वयन है। जहां तक ​​मैं समझता हूं, यह ग्राहक की क्षमताओं पर सवाल उठाता है और फिर किसी भी संदेह को दूर करने के लिए केवल सबसे अच्छा उपलब्ध प्रदान करता है।


2
"यह ग्राहक की क्षमताओं पर सवाल उठाता है" हालांकि यह एक उपयोगी विवरण नहीं है। किसी और के लिए अपने स्वयं के कार्यान्वयन को करने के लिए शायद ही पर्याप्त जानकारी है।
Womble
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.