यदि कोई सर्वर HTTPS के लिए SNI का उपयोग कर रहा है तो मैं कैसे पता लगा सकता हूं?


41

मैं यह जानने का एक सरल तरीका खोज रहा हूं कि क्या कोई सर्वर किसी वेबसाइट पर अपने HTTPS प्रमाणपत्र के लिए सर्वर नाम इंडिकेशन SSL एक्सटेंशन का उपयोग कर रहा है। एक विधि जो ब्राउज़र या यूनिक्स कमांड लाइन का उपयोग करती है वह ठीक है।

धन्यवाद!

जवाबों:


20

एसएनआई क्लाइंट द्वारा शुरू किया जाता है, इसलिए आपको एक क्लाइंट की आवश्यकता होती है जो इसका समर्थन करता है। जब तक आप विंडोज़ एक्सपी पर न हों, आपका ब्राउज़र करेगा। यदि आपका क्लाइंट आपको SSL कनेक्शन को ठीक से डीबग करने देता है (दुख की बात है, यहां तक ​​कि gnutls / opensl CLI कमांड नहीं करता है), तो आप देख सकते हैं कि सर्वर विस्तारित hello में एक server_name फ़ील्ड को वापस भेजता है या नहीं। ध्यान दें कि इस क्षेत्र की अनुपस्थिति का मतलब केवल यह है कि सर्वर ने सर्टिफिकेट लेने में मदद करने के लिए क्लाइंट हैलो में server_name का उपयोग नहीं किया, न कि यह इसका समर्थन नहीं करता है।

तो, अभ्यास में सबसे आसान परीक्षा केवल कनेक्ट करने का प्रयास करना है। इसके लिए आपको दो नामों को जानना होगा जो एक ही आईपी के लिए हल करते हैं, जिससे एक ssl कनेक्शन बनाया जा सकता है। https सबसे आसान है क्योंकि आप केवल दोनों नामों को ब्राउज़ कर सकते हैं और देख सकते हैं कि क्या आप सही प्रमाण पत्र के साथ प्रस्तुत किए गए हैं।

तीन परिणाम हैं:

  • आपको वाइल्डकार्ड प्रमाणपत्र मिलता है (या एक विषय के साथ एक नाम) जो दोनों नामों को शामिल करता है: आप कुछ भी नहीं सीखते हैं
  • आपको उनमें से कम से कम एक के लिए गलत प्रमाण पत्र मिलता है: या तो सर्वर एसएनआई का समर्थन नहीं करता है या इसे गलत तरीके से कॉन्फ़िगर किया गया है
  • आपको दो अलग-अलग प्रमाण पत्र मिलते हैं, दोनों सही नाम के लिए: एसएनआई समर्थित है और सही ढंग से कॉन्फ़िगर किया गया है।

थोड़ा और अधिक जटिल परीक्षण जो अधिक जानकारी देगा, ब्राउज़ करते समय तारों के खुले और कैप्चर करने के लिए है। तब आप ssl.handshake के लिए फ़िल्टर करके संबंधित पैकेट ढूँढ सकते हैं। नीचे दिए गए स्क्रीनशॉट क्लाइंट हैलो / सर्वर हैलो जोड़ी का एक उदाहरण है जहां SNI समर्थित है:

ग्राहक नमस्ते सर्वर हेलो

फिर, बेशक सर्वर हैलो में सर्वर_नाम फ़ील्ड की अनुपस्थिति यह नहीं दर्शाती है कि एसएनआई समर्थित नहीं है। केवल यह सुनिश्चित करें कि क्लाइंट-प्रदान किया गया server_name किस प्रमाणपत्र का उपयोग करने का निर्णय लेने में उपयोग नहीं किया गया था।


9
डेनिस - पर असहमत openssl। कुछ विवरण उपलब्ध हैं: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443एसएनआई का उपयोग करने के कुछ संकेत क्वालिस एसएसएल परीक्षण के दौरान दिए गए हैं ।
हिरण हंटर

आह, मैं उस पेज में याद किया। जोड़ के लिए धन्यवाद।
डेनिस करसेमेकर

26

एक लाइनर जिसे आप संभवतः एसएसएल / टीएलएस सर्वर नाम इंडिकेशन एक्सटेंशन हेडर की उपस्थिति का पता लगाने के लिए देख रहे हैं:

openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"

जहाँ www.SERVERNAME.comआप परीक्षण कर रहे हैं एसएनआई मान है और आपके द्वारा परीक्षण किए जा रहे www.YOURSERVER.comटीएलएस-सक्षम सर्वर का डोमेन नाम या आईपी पता है।

कमांड लाइन पोर्ट पर सर्वर से कनेक्ट करने के लिए openssls s_client( क्लियर (s_client (1) देखें ) का उपयोग करती है । TLS एक्सटेंशन पर विकल्प बदल जाता है उत्पादन डिबगिंग। विकल्प बताता कार्यक्रम पारित करने के लिए TLS हैंडशेक के दौरान ClientHello पैकेट में SNI फ़ील्ड का मान के रूप में।www.YOURSERVER.com443-tlsextdebug-servernames_clientwww.SERVERNAME.com

अंत में, 2>/dev/nullबस stderr आउटपुट (जो शोर हो सकता है) को छुपाता है और | grep "server name"पाइपलाइन फ़िल्टर TLS एक्सटेंशन को "सर्वर नाम" को s_client'TLS एक्सटेंशन डीबगिंग आउटपुट' में प्रदर्शित करता है ।

यदि आप आउटपुट की एक लाइन देखते हैं जैसे कि

TLS server extension "server name" (id=0), len=0

तब सर्वर अपने सर्वरहेलो प्रतिक्रिया में एसएनआई हेडर जानकारी लौटा रहा है। यदि आप नहीं करते हैं, तो यह संभव है कि सर्वर या तो एसएनआई का समर्थन नहीं करता है या इसे एसएनआई जानकारी वापस करने के लिए कॉन्फ़िगर नहीं किया गया है जिसे आप पूछ रहे हैं। इस स्थिति में, डबल-चेक करें कि आप उस डोमेन नाम का उपयोग कर रहे हैं -servernameजिसमें सर्वर को एसएनआई की जानकारी के साथ जवाब देना चाहिए।


1
आउटपुट वही है जो मैं सही उपयोग करता हूं -servernameया नहीं। -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(और यदि वे मेल खाते हैं तो वही आउटपुट।) आप कैसे सत्यापित करते हैं कि यह आउटपुट से सर्वर पर होस्ट से मेल नहीं खाता है?
१ea

1
@bshea आपको -msgउपरोक्त पैरामीटर्स के अलावा पास करने की आवश्यकता है और "अलर्ट" के लिए grep। अगर -servernameगलत है तो आपको TLS 1.2 Alert ... warning unrecognized_nameसर्वर से कुछ मिलेगा । @Meitar मुझे लगता है कि यदि आप उत्तर में जोड़ते हैं तो अन्य लोगों के लिए उपयोगी होगा।
विक्टर नोनोव

@ViktorNonov -msgस्विच बस TLS प्रोटोकॉल संदेशों का एक हेक्सडंप जोड़ता है। टीएलएस हैंडशेक त्रुटि का पालन करना आवश्यक नहीं है, इसलिए इस उत्तर को जोड़ना गलत होगा। इसके अलावा, इस तरह की TLS हैंडशेक त्रुटियां STDOUT पर छपी हैं, जिसका अर्थ यह होगा कि 2>/dev/nullइसके उत्तर grepको पहले स्थान पर संसाधित करने के लिए उत्तर को हटाने की आवश्यकता होगी । @Bshea वास्तव में क्या पूछ रहा है "मैं टीएलएस त्रुटियों का पता कैसे लगा सकता हूं?" जो पूरी तरह से एक अलग सवाल है "क्या यह सर्वर टीएलएस प्रोटोकॉल की एसएनआई सुविधा का उपयोग करता है?" जो यहाँ का विषय है।
Meitar

@Meitar, मैं TLS हैंडशेक संदेशों का निरीक्षण करने का एक और तरीका नहीं खोज सका। भले ही मैं STDERRकिसी पाठ फ़ाइल में रीडायरेक्ट करता हूं, मुझे वहां वह त्रुटि नहीं मिल रही है। बिना -msgमैं अन्य विकल्प नहीं खोज सकता जो हैंडशेक संदेश दिखाता है। (खुलता है 1.0.2q का उपयोग करके)। जब तक उत्तर के लिए प्रासंगिकता सही हो सकती है।
विक्टर नॉनोव

-2

आप opensslप्रमाण पत्र लाने और क्वेरी करने के लिए उपयोग कर सकते हैं ।

  • साथ लाने का प्रमाण पत्र openssl s_client -connect
  • के साथ प्रमाणपत्र पार्स करें openssl x509
  • grep "DNS:" जानकारी खोजने के लिए

openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:

% openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = BM, O = QuoVadis Limited, CN = QuoVadis Global SSL ICA G2
verify return:1
depth=0 C = CH, ST = Zuerich, L = Zuerich, O = Kaspar Brand, CN = alice.sni.velox.ch
verify return:1
                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

अंतिम पंक्ति सर्टिफिकेट में मौजूद सभी SNI प्रविष्टियों को दिखाती है:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

मैं उस आउटपुट में क्या देख रहा हूँ? तथ्य यह है कि कई डोमेन मौजूद हैं?
spookylukey

DNS:... अंतिम पंक्ति की प्रविष्टियाँ प्रमाणपत्र में सभी मान्य SNI नामों को दर्शाती हैं।
spazm

4
एक सर्टिफिकेट में एसएएन और एक सर्वर पर एसएनआई सपोर्ट अलग-अलग चीजें हैं, एचटीटीपीएस वर्चुअलहोस्टिंग के लिए एसएनएस का उपयोग हैक की एक ऐसी चीज है जो एसएनआई से पहले होती है। SNI के लिए आपको SAN के साथ प्रमाणपत्र की आवश्यकता नहीं है क्योंकि सर्वर एक व्यक्तिगत प्रमाण पत्र का चयन करने में सक्षम है जो ग्राहकों के नामकरण की अपेक्षाओं से मेल खाता है।
mr.spuratic
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.