"हैंडशेक विफलता" का अर्थ है हैंडशेक विफल होना, और एसएसएल / टीएलएस कनेक्शन नहीं है। आपको यह देखना चाहिए कि openssl
शेल (या सीएमडी आदि) से बाहर निकलता है और सर्वर पर इनपुट डेटा भेजे जाने का इंतजार नहीं करता है। "वेरिफ़ रिटर्न कोड 0" का अर्थ है कि सर्वर के प्रमाण पत्र में कोई समस्या नहीं पाई गई थी , या तो क्योंकि यह बिल्कुल भी चेक नहीं किया गया था या क्योंकि यह चेक किया गया था और अच्छा था (जहां तक कि ओपनएसएसएल के चेक चलते हैं, जो सब कुछ कवर नहीं करता है); इस मामले में प्रोटोकॉल को जानकर हम बाद में लागू होने वाले मामले को घटा सकते हैं।
अलर्ट प्राप्त करनाbad certificate
(कोड 42) का मतलब है कि सर्वर आपसे एक प्रमाण पत्र के साथ प्रमाणित करने की मांग करता है , और आपने ऐसा नहीं किया, और इससे हैंडसम विफलता हुई। लाइन से पहले कुछ पंक्तियाँ SSL handshake has read ... and written ...
आपको Acceptable client certificate CA names
आमतौर पर CA की पहचान करने वाली कई लाइनों के बाद एक लाइन दिखनी चाहिए, संभवतः एक लाइन शुरुआत के बाद Client Certificate Types
और शायद Requested Signature Algorithms
आपके ओपनएसएसएल संस्करण और बातचीत किए गए प्रोटोकॉल के आधार पर कुछ ।
'स्वीकार्य' सूची में CA द्वारा जारी किया गया एक प्रमाण पत्र प्राप्त करें , या यदि यह दस्तावेज पर या सर्वर के बारे में यह कहकर खाली कर दिया गया था कि कौन सा सीए इस पर भरोसा करता है या सर्वर ऑपरेटरों या मालिकों से संपर्क करें और उनसे पूछें, साथ ही साथ मिलान करने वाली निजी कुंजी , दोनों PEM प्रारूप में, और उन्हें निर्दिष्ट के साथ -cert $file -key $file
; यदि आपके पास दोनों एक ही फ़ाइल में हैं, तो PEM के साथ संभव है, बस उपयोग करें-cert $file
। यदि आपके पास उन्हें एक अलग प्रारूप में है, तो या तो इसे निर्दिष्ट करें, या यहां खोजें और शायद सुपरयूज़र और सुरक्षा। एक्स; विभिन्न प्रमाणपत्रों और निजीकरण प्रारूपों को परिवर्तित करने के बारे में पहले से ही कई प्रश्नोत्तर हैं। यदि आपके प्रमाणपत्र को सत्यापित करने के लिए "चेन" या "इंटरमीडिएट" सर्टिफिकेट (या एक से अधिक भी) की आवश्यकता है, जैसा कि अक्सर सर्वर को कैसे कॉन्फ़िगर किया जाता है, इसके आधार पर एक सार्वजनिक सीए (एक इनडोर एक बनाम) से एक प्रमाण पत्र के लिए मामला है, s_client
एक ट्रिक की आवश्यकता होती है: या तो अपने सिस्टम ट्रस्टस्टोर में चेन सर्टिफिकेट (एस) जोड़ें, या सीए सर्टिफिकेट वाले एक स्थानीय / अस्थायी ट्रस्टस्टोर को बनाएं, आपको सर्वर को सत्यापित करने की आवश्यकता है चेन चेन (एस) जिसे आपको भेजने की आवश्यकता है।
यदि आपके पास ऐसा कोई प्रमाण पत्र नहीं है, तो आपको या तो एक प्राप्त करने की आवश्यकता है, जो कि एक अलग प्रश्न है जिसका उत्तर देने के लिए बहुत अधिक विवरण की आवश्यकता है, या आपको प्रमाण पत्र प्रमाणीकरण का उपयोग किए बिना सर्वर से कनेक्ट करने का तरीका खोजने की आवश्यकता है; फिर से दस्तावेज़ देखें और / या ऑपरेटरों / मालिकों से पूछें।
संपादित करें: यह टिप्पणी से प्रतीत होता है कि आपके पास क्लाइंट कुंजी और प्रमाणित श्रृंखला के साथ-साथ जावा में सर्वर एंकर (एस) भी हो सकता है। जाँच करने पर मुझे उस मामले को पूरी तरह से कवर करने वाला एक अच्छा मौजूदा जवाब नहीं दिखता है, इसलिए भले ही यह शायद अच्छी तरह से खोज नहीं करेगा:
# Assume Java keystore is type JKS (the default but not only possibility)
# named key.jks and the privatekey entry is named mykey (ditto)
# and the verify certs are in trust.jks in entries named trust1 trust2 etc.
# convert Java key entry to PKCS12 then PKCS12 to PEM files
keytool -importkeystore -srckeystore key.jks -destkeystore key.p12 -deststoretype pkcs12 -srcalias mykey
openssl pkcs12 -in key.p12 -nocerts -out key.pem
openssl pkcs12 -in key.p12 -nokeys -clcerts -out cert.pem
openssl pkcs12 -in key.p12 -nokeys -cacerts -out chain.pem
# extract verify certs to individual PEM files
# (or if you 'uploaded' PEM files and still have them just use those)
keytool -keystore trust.jks -export -alias trust1 -rfc -file trust1.pem
keytool -keystore trust.jks -export -alias trust2 -rfc -file trust2.pem
... more if needed ...
# combine for s_client
cat chain.pem trust*.pem >combined.pem
openssl s_client -connect host:port -key key.pem -cert cert.pem -CAfile combined.pem