वेबसाइट से ssl सर्टिफिकेट कैसे डाउनलोड करें?


182

मैं https://www.google.com से ssl सर्टिफिकेट डाउनलोड करना चाहता हूं , wget या किसी अन्य कमांड का उपयोग करके। कोई यूनिक्स कमांड लाइन? wget या opsl?

जवाबों:


246

प्रमाण पत्र डाउनलोड करने के लिए, आपको ग्राहक को इस तरह से ओपनसेल में निर्मित करने की आवश्यकता है:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

जो प्रमाणपत्र को बचाएगा /tmp/$SERVERNAME.cert

-showcertsयदि आप श्रृंखला में सभी प्रमाण पत्र डाउनलोड करना चाहते हैं तो आप इसका उपयोग कर सकते हैं । लेकिन अगर आप केवल सर्वर प्रमाणपत्र डाउनलोड करना चाहते हैं, तो निर्दिष्ट करने की कोई आवश्यकता नहीं है-showcerts

echo -n सर्वर को एक प्रतिक्रिया देता है, ताकि कनेक्शन जारी हो जाए

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'प्रमाणपत्र श्रृंखला और कनेक्शन विवरण के बारे में जानकारी निकालता है। प्रमाण पत्र को अन्य कीस्टोर्स में आयात करने के लिए यह पसंदीदा प्रारूप है।


9
सराहना करें कि आपने न केवल एक अच्छा उत्तर दिया, बल्कि एक सटीक विवरण भी दिया।
मार्को।

क्या -showcertsसर्वर / लीफ सर्टिफिकेट भी दिखाता है? मैंने सोचा कि यह केवल मध्यवर्ती प्रदर्शित करता है जब उस स्विच को शामिल किया गया था।
माइक बी

जैसा कि उत्तर में कहा गया है, s_clientहमेशा सर्वर सर्टिफिकेट दिखाता है (यदि कोई है, तो अर्थात सर्वर हैलो पर प्रतिक्रिया करता है और एक अनाम सूट नहीं चुनता है)। प्राप्त सभी सेर्ट्स, सर्वर सर्टिफिकेट पहले इंटरमीडिएट और / या रूट -showcertsदिखाता है ।
dave_thompson_085

4
हालाँकि, यह किसी प्रॉक्सी की उपस्थिति में काम नहीं करता है।
फ्रेडरिक नॉर्ड

2
यह उन सर्वरों के साथ भी काम नहीं करता है जो एसएनआई (एक ही आईपी-एड्रेस पर कई प्रमाणपत्र / डोमेन) का उपयोग करते हैं। समस्याओं से बचने के लिए, Opensl के सर्वरनाम पैरामीटर को निर्दिष्ट करें: Opensl s_client -connect HOST: PORTNUMBER -servername CN
verhage

60

मुझे जवाब मिल गया। Openssl इसे प्रदान करता है।

खुलता है s_client -connect $ {REMHOST}: $ {REMPORT}


2
openssl x509 -text <<EOF cert-text EOFप्रमाण पत्र का विवरण देखने के लिए भी
mpapis

2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemserverfault.com/questions/139728/… के
पुलकितसिंघल

यह वही पूरा करता है और sedहैक को छोड़ देता है ।
phs

यह सिर्फ एक प्रमाण पत्र की जांच करता है, क्या होगा यदि सेवा सर्वरों के लोड संतुलित समूह का हिस्सा है, जिनमें से प्रत्येक के पास एक अलग प्रमाण पत्र है, संभवतः एक अलग रूट सीए द्वारा हस्ताक्षरित है? या दूसरे शब्दों में, एक माइटम अटैक इस अनुरोध को वास्तविक साइट पर गर्त में जाने दे सकता है, और फिर अन्य अनुरोधों को अपने सर्वर पर निर्देशित कर सकता है। क्या इसकी जांच के लिए कोई तरीके हैं? और सभी प्रमाणपत्रों की एक सूची प्राप्त करने के लिए जो वास्तव में एक डोमेन है?
जेन्स टिम्मरमैन

@JensTimmerman "या दूसरे शब्दों में, एक माइटम अटैक इस अनुरोध को वास्तविक साइट पर गर्त में जाने दे सकता है, और फिर अन्य अनुरोधों को अपने सर्वर पर निर्देशित कर सकता है।" यह तब तक संभव नहीं है जब तक कि मैन-इन-द-बीच के पास लक्ष्य सर्वर के लिए एक वैध प्रमाण पत्र नहीं है (या क्लाइंट मूर्खतापूर्ण रूप से सर्वर प्रमाण पत्र की जांच नहीं करता है)। जाहिर है, अगर सर्वर कभी-कभी एक अलग प्रमाण पत्र प्रदान करता है, तो आप केवल कनेक्शन के प्रयासों को दोहराकर संभवतः उन सभी को प्राप्त करने की उम्मीद कर सकते हैं।
डेविड टोनहोफर 16

22

GNUTLS ग्राहक उपकरण, gnutls-cliभी इस आसान बना सकते हैं:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

कार्यक्रम साइट के लिए एक इंटरैक्टिव क्लाइंट प्रदान करने के लिए डिज़ाइन किया गया है, इसलिए आपको /dev/nullइंटरैक्टिव सत्र समाप्त करने के लिए इसे खाली इनपुट (इस उदाहरण में, से ) देने की आवश्यकता है।


1
यह (सिस्टम वाइड कॉन्फ़िगर किया गया) https प्रॉक्सी के माध्यम से कैसे कनेक्ट होता है और इसे कैसे प्रिंट करता है?
फ्रेडरिक नॉर्ड

9

@bignose उत्तर के आधार पर, यहाँ एक स्व-निहित संस्करण है जो उदाहरण के लिए शेफ की रेसिपी में अच्छी तरह से फिट बैठता है:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates

6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

खुलने की यह विधा स्टड की अपेक्षा करती है, इसलिए हम इसे प्रदान करते हैं true |, यह -connect पैरामीटर में निर्दिष्ट सर्वर से जुड़ता है। 2>/dev/nullमौन त्रुटियों (वैकल्पिक), हम पूरे आउटपुट को x509 पार्सर में पास कर सकते हैं, /dev/stdinशेल फाइल को इनपुट फाइल के रूप में उपयोग करने के लिए निर्दिष्ट करते हैं। और उस इच्छा उत्पादन सिर्फ -----BEGIN CERTIFICATE-----करने के लिए -----END CERTIFICATE-----के भाग s_clientउत्पादन। आप > google.com.pemकमांड के अंत में जोड़कर फ़ाइल में रीडायरेक्ट कर सकते हैं ।


जैसा कि सबसे अच्छा मैं बता सकता हूं, यह प्रमाण पत्र श्रृंखला को सत्यापित नहीं करता है, यह केवल आपको बता सकता है कि अंतिम सर्वर प्रदान करने वाली एसएसएल पहचान क्या है।


2
(1) यह वास्तव में 6 साल पहले से जवाब में सुधार नहीं करता है (2) x509डिफ़ॉल्ट रूप से स्टड को पढ़ता है इसलिए -in /dev/stdinबेमानी है (3) s_clientएक स्थानीय ट्रस्ट एंकर (रूट) को सर्वर सर्टिफिकेट को सही ढंग से सत्यापित करता है और अप्रकाशित है, लेकिन आपने इस जानकारी को दबा दिया जो इसे दिखाएगा (4) यह निरसन के लिए जाँच नहीं करता है (5) यह केवल 1.0.2 में सर्वर सर्टिफिकेट में नाम की जांच करता है और फिर डिफ़ॉल्ट रूप से नहीं (लेकिन आप आसानी से जाँच कर सकते हैं कि स्वयं को देखकर बाद में)
dave_thompson_085

@ dave_thompson_085, सवाल यह है कि प्रमाण पत्र कैसे डाउनलोड करें, लेकिन श्रृंखला की जानकारी नहीं दिखाएं। मैं एक और उत्तर में sed की तुलना में ज्यादा बेहतर खुलता है।
डेर_मिस्टर

0

पूर्व और प्रक्रिया प्रतिस्थापन का उपयोग करके वैकल्पिक वाक्यविन्यास:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.