स्वयं हस्ताक्षरित एसएसएल प्रमाणपत्र पर विश्वास करने के लिए पायथन अनुरोध कैसे प्राप्त करें?


88
import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)

यदि URL स्व हस्ताक्षरित प्रमाणपत्र का उपयोग करता है, तो यह विफल हो जाता है

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

मुझे पता है कि मैं इस तरह पैरामीटर Falseको पास कर सकता हूं verify:

r = requests.post(url, data=data, verify=False)

हालाँकि, मैं जो करना चाहूंगा वह डिस्क पर सार्वजनिक कुंजी की प्रतिलिपि के लिए बिंदु अनुरोध है और इसे उस प्रमाण पत्र पर भरोसा करने के लिए कहें।


जवाबों:


61

प्रयत्न:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')

1
क्या आप ऐसा ही कर सकते हैं और उसी समय क्लाइंट सर्टिफिकेट का उपयोग कर सकते हैं? मुझे इससे समस्या हो रही है।
user1156544

10
ध्यान दें कि आपके द्वारा पास की जाने वाली .pem फ़ाइल में सर्वर का प्रमाणपत्र और कोई मध्यवर्ती प्रमाणपत्र शामिल होना चाहिए । मैंने सर्वर के प्रमाणपत्र को जोड़ने के बाद यह पता लगाने की कोशिश नहीं की कि यह काम क्यों कर रहा है।
क्रिसबॉक

मैंने स्वप्रमाणित प्रमाणपत्र जोड़ दिया। पीईएम, और यह काम किया।
एचएस राठौर

6
यह तकनीक मेरे काम नहीं आई। मैंने इसके ssl.get_server_certificateलिए एक प्रमाणपत्र डाउनलोड किया (self-signed.badssl.com, 443), उस प्रमाणपत्र को सहेजा cert.pemऔर फिर चला गया requests.get('https://self-signed.badssl.com/', verify='cert.pem')और यह अभी भी एसएसएल त्रुटि के साथ विफल रहा (वह प्रमाणपत्र स्वयं हस्ताक्षरित है)।
जेसन आर। कोम्ब्स

41

verifyपैरामीटर के साथ आप एक कस्टम प्रमाणपत्र प्राधिकारी बंडल प्रदान कर सकते हैं

requests.get(url, verify=path_to_bundle_file)

से डॉक्स :

आप verifyभरोसेमंद सीए के प्रमाण पत्र के साथ एक CA_BUNDLE फ़ाइल का पथ पास कर सकते हैं । विश्वसनीय CA की इस सूची को REQUESTS_CA_BUNDLE पर्यावरण चर के माध्यम से भी निर्दिष्ट किया जा सकता है।


26

सबसे आसान चर को निर्यात करना है REQUESTS_CA_BUNDLEजो आपके निजी प्रमाण पत्र प्राधिकरण, या एक विशिष्ट प्रमाणपत्र बंडल को इंगित करता है। कमांड लाइन पर आप निम्न कार्य कर सकते हैं:

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

यदि आपके पास अपना प्रमाणपत्र प्राधिकारी है और आप exportहर बार टाइप करने के REQUESTS_CA_BUNDLEलिए अपने ~/.bash_profileअनुसार नहीं जोड़ सकते हैं :

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile

पर्यावरण चर वह था जिसे मुझे ओपनएसएसएल सर्टिफिकेट फ़ाइल में संग्रहीत प्रमाणपत्रों के साथ काम करने के लिए PyCharm प्राप्त करने की आवश्यकता थी।
ब्रैडी

मेरे पास श्रृंखला में एक स्व-हस्ताक्षरित प्रमाण पत्र है। इस समाधान ने मेरी समस्या को boto3 पुस्तकालय के साथ हल किया।
इल्किन

7

मामला जहां कई प्रमाणपत्रों की आवश्यकता होती है, इस प्रकार हल किया गया था: एक फ़ाइल के लिए कई रूट पेम फ़ाइलों, MyCert-A-Root.pem और myCert-B-Root.pem को मिलाएं। फिर अनुरोधों को उस फ़ाइल में REQUESTS_CA_BUNDLE संस्करण में सेट करें ।/.bash_profile।

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile

उस दिन का मेरा "आह्ह्ह" पल था ... बहुत बहुत धन्यवाद ... इस संकेत के साथ मुझे काम करने के लिए मेरे स्व हस्ताक्षरित जीरा मिल गया ... ;-) मुझे पता है कि शायद साइटों का हंड्रेस्ट और उत्तर हैं जो इस का वर्णन करते हैं; , लेकिन मैंने तुम्हारा पाया, इसलिए तुम मेरी जांच को हल करने में मेरी मदद करने के लिए मेरा श्रेय प्राप्त कर ... d
alexrjs

4

सेटिंग export SSL_CERT_FILE=/path/file.crtकाम करना चाहिए।


धन्यवाद। मेरे लिए काम करता है (जबकि REQUESTS_CA_BUNDLEचर का मेरे मामले में कोई प्रभाव नहीं है)।
पास्कल एच।

0

IncasePib2 के लिए किसी को भी यहां उतरने के लिए होता है (जैसे मैंने किया था) CA (मेरे मामले में चार्ल्स प्रॉक्सी) को जोड़ने की तलाश में, ऐसा लगता है कि आप इसे cacerts.txtअजगर पैकेज के साथ शामिल फ़ाइल में जोड़ सकते हैं ।

उदाहरण के लिए:

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

अन्य समाधानों में संदर्भित पर्यावरण चर, अनुरोध-विशिष्ट प्रतीत होते हैं और मेरे परीक्षण में CANplib2 द्वारा नहीं उठाए गए थे।


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