2015-05-22 12 views
29
import requests 
data = {'foo':'bar'} 
url = 'https://foo.com/bar' 
r = requests.post(url, data=data) 

यूआरएल एक आत्म हस्ताक्षरित प्रमाणपत्र का उपयोग करता है, तो यहपाइथन अनुरोधों को स्वयं हस्ताक्षरित SSL प्रमाणपत्र पर भरोसा करने के लिए कैसे प्राप्त करें?

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

के साथ विफल हो मुझे पता है कि मैं verify पैरामीटर के लिए False पारित कर सकते हैं, इस तरह:

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

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

+0

http://stackoverflow.com/questions/10667960/python-requests-throwing-up-sslerror?rq=1 – Ajay

उत्तर

27

कोशिश:

r = requests.post(url, data=data, verify='/path/to/public_key.pem') 
26
verify पैरामीटर आप एक कस्टम प्रमाणपत्र प्राधिकार बंडल प्रदान कर सकते हैं ( http://docs.python-requests.org/en/latest/user/advanced/) के साथ

:

requests.get(url, verify=path_to_bundle) 

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

तुम भी ग्राहक के पक्ष प्रमाण पत्र के रूप में, एक एकल फाइल के रूप में या दोनों फ़ाइल पथ के एक टपल के रूप में (निजी कुंजी और प्रमाणपत्र युक्त) उपयोग करने के लिए एक स्थानीय प्रमाणपत्र निर्दिष्ट कर सकते हैं:

>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key')) 
<Response [200]> 
7

परिवर्तनीय 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 
2

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

$ 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 
0

बैठाना किसी को भी यहां भूमि होता है (जैसे मैंने किया था) एक सीए को जोड़ने के लिए httplib2 के लिए (मेरे मामले चार्ल्स प्रॉक्सी में) देख की तरह आप इसे cacerts.txt फाइल करने के लिए जोड़ सकते हैं अजगर पैकेज के साथ शामिल है, यह लग रहा है।

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

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

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

0

export SSL_CERT_FILE=/path/file.crt को सेट करना नौकरी करना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे