मैं यह जानने का एक सरल तरीका खोज रहा हूं कि क्या कोई सर्वर किसी वेबसाइट पर अपने HTTPS प्रमाणपत्र के लिए सर्वर नाम इंडिकेशन SSL एक्सटेंशन का उपयोग कर रहा है। एक विधि जो ब्राउज़र या यूनिक्स कमांड लाइन का उपयोग करती है वह ठीक है।
धन्यवाद!
मैं यह जानने का एक सरल तरीका खोज रहा हूं कि क्या कोई सर्वर किसी वेबसाइट पर अपने HTTPS प्रमाणपत्र के लिए सर्वर नाम इंडिकेशन SSL एक्सटेंशन का उपयोग कर रहा है। एक विधि जो ब्राउज़र या यूनिक्स कमांड लाइन का उपयोग करती है वह ठीक है।
धन्यवाद!
जवाबों:
एसएनआई क्लाइंट द्वारा शुरू किया जाता है, इसलिए आपको एक क्लाइंट की आवश्यकता होती है जो इसका समर्थन करता है। जब तक आप विंडोज़ एक्सपी पर न हों, आपका ब्राउज़र करेगा। यदि आपका क्लाइंट आपको SSL कनेक्शन को ठीक से डीबग करने देता है (दुख की बात है, यहां तक कि gnutls / opensl CLI कमांड नहीं करता है), तो आप देख सकते हैं कि सर्वर विस्तारित hello में एक server_name फ़ील्ड को वापस भेजता है या नहीं। ध्यान दें कि इस क्षेत्र की अनुपस्थिति का मतलब केवल यह है कि सर्वर ने सर्टिफिकेट लेने में मदद करने के लिए क्लाइंट हैलो में server_name का उपयोग नहीं किया, न कि यह इसका समर्थन नहीं करता है।
तो, अभ्यास में सबसे आसान परीक्षा केवल कनेक्ट करने का प्रयास करना है। इसके लिए आपको दो नामों को जानना होगा जो एक ही आईपी के लिए हल करते हैं, जिससे एक ssl कनेक्शन बनाया जा सकता है। https सबसे आसान है क्योंकि आप केवल दोनों नामों को ब्राउज़ कर सकते हैं और देख सकते हैं कि क्या आप सही प्रमाण पत्र के साथ प्रस्तुत किए गए हैं।
तीन परिणाम हैं:
थोड़ा और अधिक जटिल परीक्षण जो अधिक जानकारी देगा, ब्राउज़ करते समय तारों के खुले और कैप्चर करने के लिए है। तब आप ssl.handshake के लिए फ़िल्टर करके संबंधित पैकेट ढूँढ सकते हैं। नीचे दिए गए स्क्रीनशॉट क्लाइंट हैलो / सर्वर हैलो जोड़ी का एक उदाहरण है जहां SNI समर्थित है:
फिर, बेशक सर्वर हैलो में सर्वर_नाम फ़ील्ड की अनुपस्थिति यह नहीं दर्शाती है कि एसएनआई समर्थित नहीं है। केवल यह सुनिश्चित करें कि क्लाइंट-प्रदान किया गया server_name किस प्रमाणपत्र का उपयोग करने का निर्णय लेने में उपयोग नहीं किया गया था।
एक लाइनर जिसे आप संभवतः एसएसएल / टीएलएस सर्वर नाम इंडिकेशन एक्सटेंशन हेडर की उपस्थिति का पता लगाने के लिए देख रहे हैं:
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
टीएलएस-सक्षम सर्वर का डोमेन नाम या आईपी पता है।
कमांड लाइन पोर्ट पर सर्वर से कनेक्ट करने के लिए openssl
s s_client
( क्लियर (s_client (1) देखें ) का उपयोग करती है । TLS एक्सटेंशन पर विकल्प बदल जाता है उत्पादन डिबगिंग। विकल्प बताता कार्यक्रम पारित करने के लिए TLS हैंडशेक के दौरान ClientHello पैकेट में SNI फ़ील्ड का मान के रूप में।www.YOURSERVER.com
443
-tlsextdebug
-servername
s_client
www.SERVERNAME.com
अंत में, 2>/dev/null
बस stderr आउटपुट (जो शोर हो सकता है) को छुपाता है और | grep "server name"
पाइपलाइन फ़िल्टर TLS एक्सटेंशन को "सर्वर नाम" को s_client
'TLS एक्सटेंशन डीबगिंग आउटपुट' में प्रदर्शित करता है ।
यदि आप आउटपुट की एक लाइन देखते हैं जैसे कि
TLS server extension "server name" (id=0), len=0
तब सर्वर अपने सर्वरहेलो प्रतिक्रिया में एसएनआई हेडर जानकारी लौटा रहा है। यदि आप नहीं करते हैं, तो यह संभव है कि सर्वर या तो एसएनआई का समर्थन नहीं करता है या इसे एसएनआई जानकारी वापस करने के लिए कॉन्फ़िगर नहीं किया गया है जिसे आप पूछ रहे हैं। इस स्थिति में, डबल-चेक करें कि आप उस डोमेन नाम का उपयोग कर रहे हैं -servername
जिसमें सर्वर को एसएनआई की जानकारी के साथ जवाब देना चाहिए।
-servername
या नहीं। -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere
= TLS server extension "server name" (id=0), len=0
(और यदि वे मेल खाते हैं तो वही आउटपुट।) आप कैसे सत्यापित करते हैं कि यह आउटपुट से सर्वर पर होस्ट से मेल नहीं खाता है?
-msg
उपरोक्त पैरामीटर्स के अलावा पास करने की आवश्यकता है और "अलर्ट" के लिए grep। अगर -servername
गलत है तो आपको TLS 1.2 Alert ... warning unrecognized_name
सर्वर से कुछ मिलेगा । @Meitar मुझे लगता है कि यदि आप उत्तर में जोड़ते हैं तो अन्य लोगों के लिए उपयोगी होगा।
-msg
स्विच बस TLS प्रोटोकॉल संदेशों का एक हेक्सडंप जोड़ता है। टीएलएस हैंडशेक त्रुटि का पालन करना आवश्यक नहीं है, इसलिए इस उत्तर को जोड़ना गलत होगा। इसके अलावा, इस तरह की TLS हैंडशेक त्रुटियां STDOUT पर छपी हैं, जिसका अर्थ यह होगा कि 2>/dev/null
इसके उत्तर grep
को पहले स्थान पर संसाधित करने के लिए उत्तर को हटाने की आवश्यकता होगी । @Bshea वास्तव में क्या पूछ रहा है "मैं टीएलएस त्रुटियों का पता कैसे लगा सकता हूं?" जो पूरी तरह से एक अलग सवाल है "क्या यह सर्वर टीएलएस प्रोटोकॉल की एसएनआई सुविधा का उपयोग करता है?" जो यहाँ का विषय है।
STDERR
किसी पाठ फ़ाइल में रीडायरेक्ट करता हूं, मुझे वहां वह त्रुटि नहीं मिल रही है। बिना -msg
मैं अन्य विकल्प नहीं खोज सकता जो हैंडशेक संदेश दिखाता है। (खुलता है 1.0.2q का उपयोग करके)। जब तक उत्तर के लिए प्रासंगिकता सही हो सकती है।
आप 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
DNS:...
अंतिम पंक्ति की प्रविष्टियाँ प्रमाणपत्र में सभी मान्य SNI नामों को दर्शाती हैं।
openssl
। कुछ विवरण उपलब्ध हैं:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
एसएनआई का उपयोग करने के कुछ संकेत क्वालिस एसएसएल परीक्षण के दौरान दिए गए हैं ।