[python] पाइथन अनुरोध एसएसएलआरआरआर फेंकने की आवश्यकता है


Answers

एसएसएल सत्यापन पर अनुरोध दस्तावेज से:

अनुरोध वेब ब्राउज़र की तरह, HTTPS अनुरोधों के लिए एसएसएल प्रमाण पत्र सत्यापित कर सकते हैं। होस्ट का SSL प्रमाणपत्र जांचने के लिए, आप सत्यापित तर्क का उपयोग कर सकते हैं:

>>> requests.get('https://kennethreitz.com', verify=True)

अगर आप अपना एसएसएल प्रमाण पत्र सत्यापित नहीं करना चाहते हैं, तो verify=False

Question

मैं एक साधारण लिपि पर काम कर रहा हूं जिसमें सीएएस, जेएसप्रिंग सुरक्षा जांच, पुनर्निर्देशन इत्यादि शामिल हैं। मैं केनेथ रीट्ज के पायथन अनुरोधों का उपयोग करना चाहता हूं क्योंकि यह काम का एक बड़ा टुकड़ा है! हालांकि, सीएएस को एसएसएल के माध्यम से मान्य होने की आवश्यकता है, इसलिए मुझे पहले उस चरण को पीछे छोड़ना होगा। मुझे नहीं पता कि पाइथन अनुरोध क्या चाहते हैं? यह एसएसएल प्रमाण पत्र कहां रहता है?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed



डिबगिंग के घंटों के बाद मैं निम्नलिखित पैकेजों का उपयोग करके इसे काम करने के लिए प्राप्त कर सकता था:

requests[security]==2.7.0  # not 2.18.1
cryptography==1.9  # not 2.0

OpenSSL 1.0.2g 1 Mar 2016 का उपयोग कर

इन संकुलों के बिना verify=False काम नहीं कर रहा था।

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।




$ pip install -U requests[security]

  • पायथन 2.7.6 @ उबंटू 14.04.4 एलटीएस पर परीक्षण किया गया
  • पायथन 2.7.5 @ मैकॉक्स 10.9.5 (मैवरिक्स) पर परीक्षण

जब यह प्रश्न खोला गया (2012-05) अनुरोध संस्करण 0.13.1 था। संस्करण 2.4.1 (2014-09) पर उपलब्ध होने पर certifi पैकेज का उपयोग करके "सुरक्षा" अतिरिक्त पेश किए गए थे।

अभी (2016-09) मुख्य संस्करण 2.11.1 है, जो verify=False बिना अच्छा काम करता है verify=Falserequests.get(url, verify=False) का उपयोग करने की आवश्यकता नहीं है, अगर requests[security] अतिरिक्त के साथ स्थापित किया गया है।




यदि आपके पास एक लाइब्रेरी है जो requests पर निर्भर करती है और आप सत्यापित पथ (जैसे pyvmomi साथ) को संशोधित नहीं कर सकते हैं तो आपको अनुरोधों के साथ cacert.pem बंडल करना होगा और वहां अपना सीए जोड़ना होगा। cacert.pem स्थान ढूंढने के लिए यहां एक सामान्य दृष्टिकोण है:

विंडोज

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem

linux

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem

btw। @ request-devs, अनुरोध के साथ अपने स्वयं के cacerts बंडल वास्तव में, वास्तव में कष्टप्रद है ... विशेष रूप से तथ्य यह है कि आप पहले सिस्टम सीए स्टोर का उपयोग नहीं कर रहे हैं और यह कहीं भी दस्तावेज नहीं है।

अद्यतन करें

परिस्थितियों में, जहां आप लाइब्रेरी का उपयोग कर रहे हैं और सीए-बंडल स्थान पर कोई नियंत्रण नहीं है, आप अपने मेजबान-चौड़े सीए-बंडल होने के लिए सीए-बंडल स्थान को स्पष्ट रूप से सेट भी कर सकते हैं:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)"



मैं एक ही मुद्दे में भाग गया। बाहर निकलता है मैंने अपने सर्वर पर इंटरमीडिएट प्रमाणपत्र स्थापित नहीं किया था (बस इसे नीचे दिए गए अनुसार अपने प्रमाणपत्र के नीचे संलग्न करें)।

https://www.digicert.com/ssl-support/pem-ssl-creation.htm

सुनिश्चित करें कि आपके पास सीए-प्रमाणपत्र पैकेज स्थापित है:

sudo apt-get install ca-certificates

समय अपडेट करने से यह भी हल हो सकता है:

sudo apt-get install ntpdate
sudo ntpdate -u ntp.ubuntu.com

यदि आप एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहे हैं, तो आपको शायद इसे अपने सिस्टम में मैन्युअल रूप से जोड़ना होगा।




जैसा कि @ राफेल अल्मेडा द्वारा वर्णित है, आपके पास जो समस्या हो रही है वह अविश्वसनीय SSL प्रमाणपत्र के कारण होती है। मेरे मामले में, एसएसएल प्रमाणपत्र मेरे सर्वर द्वारा अविश्वसनीय था। सुरक्षा समझौता किए बिना इसे पाने के लिए, मैंने प्रमाण पत्र डाउनलोड किया , और इसे सर्वर पर स्थापित किया (बस .crt फ़ाइल पर डबल क्लिक करके और फिर प्रमाणपत्र स्थापित करें ...)।




मुझे gspread का उपयोग करके एक ही समस्या का सामना करना पड़ता है और ये आदेश मेरे लिए काम करते हैं:

sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28



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

import requests.api
import warnings


def requestspatch(method, url, **kwargs):
    kwargs['verify'] = False
    return _origcall(method, url, **kwargs)

_origcall = requests.api.request
requests.api.request = requestspatch
warnings.warn('Pathched requests: SSL verification disabled!')

उत्पादन में कभी भी उपयोग न करें!




इस त्रुटि के कारण अनुरोध मॉड्यूल में वर्तमान में कोई समस्या है, v2.6.2 में v2.12.4 (ATOW) में मौजूद है: https://github.com/kennethreitz/requests/issues/2573

इस समस्या के लिए वर्कअराउंड निम्न पंक्ति जोड़ रहा है: requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'






Links