सर्वर्स से प्रमाणपत्र प्राप्त करने के लिए ओप्सनल का उपयोग करना


354

मैं एक दूरस्थ सर्वर का प्रमाण पत्र प्राप्त करने की कोशिश कर रहा हूं, जिसका उपयोग मैं अपने कीस्टॉर में जोड़ने और अपने जावा एप्लिकेशन के भीतर उपयोग करने के लिए कर सकता हूं।

एक वरिष्ठ देव (जो छुट्टियों पर हैं :() ने मुझे सूचित किया कि मैं इसे चला सकता हूं:

openssl s_client -connect host.host:9999

एक कच्चा प्रमाण पत्र प्राप्त करने के लिए, जिसे मैं तब कॉपी और निर्यात कर सकता हूं। मैं निम्नलिखित आउटपुट प्राप्त करता हूं:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

मैंने इस विकल्प के साथ भी कोशिश की है

-showcerts 

और यह एक (डेबियन मन पर चल रहा है)

-CApath /etc/ssl/certs/ 

लेकिन वही त्रुटि मिलती है।

यह स्रोत कहता है कि मैं उस CApath ध्वज का उपयोग कर सकता हूं लेकिन यह मदद करने के लिए प्रतीत नहीं होता है। मैंने बिना किसी लाभ के कई रास्ते आजमाए।

कृपया मुझे बताएं कि मैं कहां गलत हूं।

जवाबों:


464

एसएनआई के साथ

यदि दूरस्थ सर्वर SNI का उपयोग कर रहा है (अर्थात, एक ही आईपी पते पर कई एसएसएल होस्ट्स साझा करना) तो आपको सही प्रमाणपत्र प्राप्त करने के लिए सही होस्टनाम भेजने की आवश्यकता होगी।

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

बिना एस.एन.आई.

यदि दूरस्थ सर्वर SNI का उपयोग नहीं कर रहा है, तो आप -servernameपैरामीटर को छोड़ सकते हैं :

openssl s_client -showcerts -connect www.example.com:443 </dev/null


किसी साइट के प्रमाणपत्र का पूरा विवरण देखने के लिए आप इस श्रृंखला का उपयोग कर सकते हैं:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

3
हम्म। मुझे उस कमांड को आजमाते समय भी वही त्रुटि मिलती है। मैंने देखा कि मेरा Openssl संस्करण 'OpenSSL 0.9.8g 19 अक्टूबर 2007' है। आपके पास कोई विचार है?
गंदा पेस्टी

39
उपयोगी: echo "" | openssl s_client -connect server:port -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' stackoverflow.com/a/12918442/843000
mbrownnyc

16
वैकल्पिक उपयोगी स्क्रिप्ट, madboa.com से :echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
rmeakins

9
इसे थोड़ा और संक्षिप्त बनाने के लिए, आप इसके sedसाथ प्रतिस्थापित कर सकते हैं openssl x509, और इसे एक उप-शेल का उपयोग करके पढ़ सकते हैं:openssl x509 -in <(openssl s_client -connect server:port -prexit 2>/dev/null)
गेब मार्टिन-डेमस्पी

27
इसके अलावाecho | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
मैटसिजल

68

जबकि मैं अरी के जवाब से सहमत हूं (और इसे उखाड़ दिया :), मुझे विंडोज पर जावा के साथ काम करने के लिए एक अतिरिक्त कदम करने की आवश्यकता थी (जहां इसे तैनात करने की आवश्यकता थी):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

openssl x509 -outform DERरूपांतरण जोड़ने से पहले , मुझे प्रमाणपत्र के प्रारूप के बारे में शिकायत करते हुए विंडोज पर कीटल से त्रुटि मिल रही थी। .Der फ़ाइल आयात करना ठीक काम करता है।


अजीब। मैं जावा 6 के बाद से विंडोज पर कीमूल के साथ पेम सर्टिफिकेट का उपयोग कर रहा हूं और कभी भी समस्या का सामना नहीं करना पड़ा।
imgx64

39

यह पता चला है कि यहां अधिक जटिलता है: मुझे इस रोलिंग को प्राप्त करने के लिए कई और विवरण प्रदान करने की आवश्यकता थी। मुझे लगता है कि इस तथ्य के साथ कुछ करना है कि इसके कनेक्शन को क्लाइंट प्रमाणीकरण की आवश्यकता होती है, और हैन्स्केक्स को उस चरण को जारी रखने के लिए अधिक जानकारी की आवश्यकता होती है जहां प्रमाण पत्र डंप किए गए थे।

यहाँ मेरा काम कमांड है:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

उम्मीद है कि यह किसी और के लिए सही दिशा में एक कुहनी है जो कुछ और जानकारी के साथ कर सकता है।


6
मुझे खेद है, लेकिन आपका जवाब बहुत मायने नहीं रखता। प्रमाण पत्र प्राप्त करने के लिए आपको सर्वर को प्रमाणपत्र पास करने की आवश्यकता है?
अरी मानेटिस

2
हां। ग्राहक प्रमाणीकरण AFAIK।
गंदा पास्ता

11
यह पता चलता है कि '-prexit' उस डेटा को भी लौटा देगा। उदाहरण के लिए, खुलता है s_client -connect होस्ट: port -prexit
Robert

39

PEM प्रारूप में दूरस्थ सर्वर से प्रमाणपत्र निकालने के लिए एक-लाइनर, इस बार का उपयोग कर sed:

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

2
यह प्रमाण पत्र निकालने के लिए लगभग सही है, बस -servernameविकल्प गायब है , पता नहीं क्यों, लेकिन मुझे इसका उपयोग पूर्ण प्रमाण पत्र प्राप्त करने के लिए करना पड़ा।
कार्ल

सर्वर नाम इंडिकेशन (SNI) के लिए -ververname आवश्यक है। बाकी पर वेब खोज का विस्तार हो सकता है।
सैम गेल्सके

32

इसके लिए सबसे आसान कमांड लाइन, जिसमें किमोर को जोड़ने के लिए पीईएम आउटपुट शामिल है, साथ ही एक मानव पठनीय आउटपुट भी है और एसएनआई का समर्थन भी करता है, जो महत्वपूर्ण है यदि आप एक HTTP सर्वर के साथ काम कर रहे हैं:

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

-Servername विकल्प SNI समर्थन और सक्षम बनाना है openssl X509 -टेक्स्ट प्रिंट मानव पठनीय प्रारूप में प्रमाण पत्र।


उदाहरण के लिए, उदाहरण के लिए ws.example.com के बजाय आप अपने-अपने सबडोमेन में जोड़ सकते हैं, उदाहरण के लिए (इसे -कनेक्ट पैरामीटर पर भी लागू करें)।
रुसलफॉफ

24

दूरस्थ सर्वर का प्रमाण पत्र प्राप्त करने के लिए आप उपयोग कर सकते हैं opensslउपकरण और आपके बीच इसे पा सकते हैं BEGIN CERTIFICATEऔर END CERTIFICATEजो आप कॉपी करें और अपने प्रमाणपत्र फ़ाइल (सीआरटी) में पेस्ट करना होगा।

यहाँ यह प्रदर्शित करने वाली कमान है:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

श्रृंखला से सभी प्रमाणपत्र वापस करने के लिए, बस जोड़ें g(वैश्विक) जैसे:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq

तो आप बस अपने प्रमाणपत्र फ़ाइल ( file.crt) को अपने किचेन में आयात कर सकते हैं और उस पर भरोसा कर सकते हैं, इसलिए जावा को शिकायत नहीं करनी चाहिए।

OS X पर आप फ़ाइल पर डबल क्लिक कर सकते हैं या अपने किचेन एक्सेस में ड्रैग एंड ड्रॉप कर सकते हैं, इसलिए यह लॉगिन / सर्टिफिकेट में दिखाई देगा। फिर आयातित प्रमाणित पर डबल-क्लिक करें और इसे हमेशा एसएसएल के लिए ट्रस्ट करें

CentOS 5 पर आप उन्हें /etc/pki/tls/certs/ca-bundle.crtफ़ाइल (और रन :) में जोड़ सकते हैं sudo update-ca-trust force-enable, या CentOS 6 में उन्हें कॉपी करके /etc/pki/ca-trust/source/anchors/चला सकते हैं sudo update-ca-trust extract

उबंटू में, उन्हें कॉपी करें /usr/local/share/ca-certificatesऔर चलाएं sudo update-ca-certificates


12
HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

6

केवल सर्टिफिकेट चेन प्रिंट करने के लिए और सर्वर सर्टिफिकेट नहीं:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

CentOS / RHEL 6/7 पर CA ट्रस्ट को अपडेट करने के लिए:

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

CentOS / RHEL 5 पर:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt

बिल्कुल वही जो मुझे CentOS7 पर चाहिए था। धन्यवाद!
आर्थर हेबर्ट

5

आप अगली bash स्क्रिप्ट का उपयोग करके सर्वर रूट प्रमाणपत्र प्राप्त कर सकते हैं और संग्रहीत कर सकते हैं:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

बस आवश्यक चर को अधिलेखित करें।


4

यदि आपका सर्वर एक ईमेल सर्वर (एमएस एक्सचेंज या जिम्ब्रा) है, तो शायद आपको starttlsऔर smtpझंडे जोड़ने की जरूरत है :

openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem

कहाँ पे,

  • HOST_EMAIL सर्वर डोमेन है, उदाहरण के लिए, mail-server.com।

  • SECURE_PORT संचार बंदरगाह है, उदाहरण के लिए, 587 या 465

  • CERTIFICATE_NAME आउटपुट का नाम (BASE 64 / PEM प्रारूप)


2

मेरे जैसे अन्य लोगों के लाभ के लिए जिन्होंने AWS CloudFront को एक्सेस करते समय यहां अच्छी सलाह का पालन करने की कोशिश की , लेकिन असफल रहे, इस ट्रिक को जोड़ना है -servername domain.name..

स्रोत: https://serverfault.com/a/780450/8972

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.