पायथन अनुरोध SSLError फेंक रहा है


350

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

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

क्या आप अधिक कोड जानकारी साझा कर सकते हैं? लगता है जैसे कोई लापता कदम है।
टैंकरस्मैश

5
आपको हमेशा उन सॉफ़्टवेयर के संस्करणों का उल्लेख करना चाहिए जिनकी आपको सहायता चाहिए।
पायोत्र डोब्रोगोस्ट

मुझे यह समस्या मिली जहां मैं अजगर 3.5 बवंडर 4.4 का उपयोग करता हूं। HTTPRequest ने validate_cert = True सेट किया है, इसलिए आप इसे
निपटाने के

इसे आज़माएँ: request.get ( ' example.com ', सत्यापित करें = certifi.where ())
Nei

जवाबों:


460

आपके द्वारा की जा रही समस्या एक अविश्वसनीय एसएसएल प्रमाणपत्र के कारण है।

पिछली टिप्पणी में उल्लिखित @dirk की तरह, सबसे तेज़ फ़िक्स सेट हो रहा है verify=False:

requests.get('https://example.com', verify=False)

कृपया ध्यान दें कि इससे प्रमाण पत्र सत्यापित नहीं होगा। यह आपके एप्लिकेशन को सुरक्षा जोखिमों, जैसे कि मैन-इन-द-मिडिल हमलों को उजागर करेगा।

बेशक, निर्णय लागू करें। जैसा कि टिप्पणियों में उल्लेख किया गया है, यह त्वरित / थकाऊ अनुप्रयोगों / लिपियों के लिए स्वीकार्य हो सकता है, लेकिन वास्तव में उत्पादन सॉफ्टवेयर पर नहीं जाना चाहिए

यदि प्रमाण पत्र की जांच केवल आपके विशेष संदर्भ में स्वीकार्य नहीं है, तो निम्न विकल्पों पर विचार करें, आपका सबसे अच्छा विकल्प verifyपैरामीटर को एक स्ट्रिंग पर सेट .pemकरना है जो प्रमाण पत्र की फ़ाइल का पथ है (जिसे आपको किसी प्रकार की सुरक्षा प्राप्त करनी चाहिए। माध्यम)।

इसलिए, संस्करण 2.0 के अनुसार, verifyपैरामीटर निम्नलिखित मानों को उनके संबंधित शब्दार्थ के साथ स्वीकार करता है:

  • True: लाइब्रेरी के अपने विश्वसनीय प्रमाणपत्र अधिकारियों के खिलाफ प्रमाण पत्र को मान्य करने का कारण बनता है (नोट: आप देख सकते हैं कि सर्टिफिकेट लाइब्रेरी के माध्यम से रूट सर्टिफिकेट अनुरोधों का उपयोग करता है, अनुरोधों से निकाले गए आरसी का एक ट्रस्ट डेटाबेस: सर्टिफिकेट - मानव के लिए ट्रस्ट डेटाबेस )।
  • False: प्रमाण पत्र सत्यापन को पूरी तरह से बायपास करता है ।
  • प्रमाणपत्रों को मान्य करने के लिए उपयोग करने के अनुरोधों के लिए एक CA_BUNDLE फ़ाइल का पथ।

स्रोत: अनुरोध - एसएसएल प्रमाणपत्र सत्यापन

एक certही लिंक पर पैरामीटर को भी देखें।


1
हां, जब मैंने ubuntu में डॉटक्लाउड का इस्तेमाल किया, तो वही "सर्टिफिकेट वेरिफाइड फेल" सामने आया। "/.Rr/local/lib/python2.6/dist-packages/dotcloud/client-client.py" में संशोधित अनुरोधों के बाद। अनुरोधों (हेडर = हेडर, हुक, हुक = हुक, सत्यापित = गलत) के बाद।
दीयाज

2
यह सही के रूप में चिह्नित नहीं है, लेकिन मैं यह सत्यापित कर सकता हूं कि यह काम करता है (नीचे दिए गए उत्तरों के विपरीत)।
khalid13

40
@ खालिद 13: एक कुल्हाड़ी "एक सिर दर्द की दवा (कोई सिर नहीं - सिरदर्द) के रूप में" काम करती है। इसका मतलब यह नहीं है कि यह इस तरह से उपयोग करने के लिए एक अच्छा विचार है। verify=Falseहोस्ट के एसएसएल प्रमाणपत्र जाँच को निष्क्रिय करता है।
jfs

24
@JFSebastian ईमानदारी से, यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। मेरे त्वरित / थ्रोअवे आवेदन के लिए, यह पर्याप्त से अधिक था।
khalid13

5
@ परिवर्तन इस तरह का बदलाव बहुत असुरक्षित लगता है ...
binki

111

SSL सत्यापन पर अनुरोधों के प्रलेखन से :

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

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

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


4
ठीक है, मैंने वेरिफिकेशन = ट्रू जोड़ा है, लेकिन फिर भी ठीक वही त्रुटि मिली है। कोई परिवर्तन नहीं होता है। कुछ और आवश्यक होना चाहिए, लेकिन यह नहीं पता कि यह क्या हो सकता है।
टेडब्यूरो

मुझे लगता है कि मैं अब एसएसएल पागलपन में उतर गया हूं। मैंने इसे अपने आरंभिक प्राप्त में जोड़ दिया ... get (url1, headers = headers, cert = '/ etc / pki / tls / cert.pem', verify = true, config = my_config) इसलिए, अब मुझे यह त्रुटि मिल रही है। request.exception.SSLError: [Errno 336265225] _ssl.c: 351: error: 140B0009: SSL दिनचर्या: SSL_CTX_use_PStreetKey_file: PEMP I का कोई सुराग नहीं है कि इसका क्या अर्थ है।
TedBurrows

14
यदि आप प्रमाण पत्र को मान्य नहीं करना चाहते हैं, तो सत्यापित करें = गलत सेट करें, यदि आपके पास स्व हस्ताक्षरित प्रमाण पत्र है तो iow
डिर्क

16
यदि आपके पास एक स्व-हस्ताक्षरित प्रमाण पत्र है, तो इसे डाउनलोड करें और इसके फ़ाइल नाम पर सत्यापित करें। सत्यापित करने के लिए कोई भी बहाना नहीं है = गलत। सत्यापित करें = '/ path / to / cert.pem'
Matthias Urlichs

14
क्षमा करें, मुझे इस उत्तर को वोट करने की आवश्यकता थी क्योंकि अनुरोध HTTPS अनुरोधों को "एक वेब ब्राउज़र की तरह" संभाल नहीं करता है। यदि सर्वर पर पूर्ण एसएसएल श्रंखला श्रद्धा (मध्यवर्ती प्रमाण पत्र सहित) घोषित नहीं है और अतिरिक्त प्रमाणपत्र डाउनलोड की आवश्यकता है, तो आपको उपरोक्त एसएसएल सत्यापन त्रुटि प्राप्त होगी। वेब ब्राउज़र अतिरिक्त डाउनलोड करेंगे और किसी भी प्रमाणपत्र त्रुटियों को चिह्नित नहीं करेंगे। यह एक तरीका है कि एक वेब ब्राउज़र और अनुरोध अलग हैं। और भी हैं। अनुरोध कुछ सत्यापन करता है, लेकिन यह ब्राउज़र की तरह अच्छा नहीं है।
लुई क्रेमेन

53

आपके द्वारा उपयोग की जा सकने वाली CA फ़ाइल का नाम verify:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

यदि आप उपयोग करते हैं verify=Trueतो requestsअपने स्वयं के CA सेट का उपयोग करता है जिसमें CA नहीं हो सकता है जो आपके सर्वर प्रमाणपत्र पर हस्ताक्षर करता है।


12
@ 9emE0iL18gxCqLT: आपको क्यों लगता है कि सभी सिस्टम आपके द्वारा दिए गए पथ का उपयोग करते हैं? requestsआपके वितरण के लिए पैक किया जा सकता है। भागो python -mrequests.certsपता लगाने के लिए जहां यह करने के लिए इंगित करता है।
jfs

3
यदि पायथन अनुरोध का कैसर्ट बंडल पुराना है, तो मैं इसे कैसे अपडेट करूं?
CMCDragonkai

5
आपको cacert.pemकर्ल से इसका उपयोग नहीं करना चाहिए । इसमें कई निरस्त किए गए सिरे होते हैं। सर्टिफिकेट देखें (जो अनुरोधों का उपयोग करता है): certifi.io
केनेथ रिट्ज

3
@KennethReitz: 1 - ओपी के लिए अनुरोधों का उपयोग क्या विफल रहता है (अन्यथा सवाल नहीं थे) 2- cacert.pemमोज़िला (सीएआरएल द्वारा) से सीए प्रमाण पत्र निकाले गए हैं - यह सिर्फ एक उदाहरण है (यदि सीए किसी लोकप्रिय वेब द्वारा उपयोग की गई सूची है) -Browser को एक उदाहरण के रूप में इस्तेमाल नहीं किया जा सकता है, तो मुझे नहीं पता कि क्या हो सकता है) - उस उत्तर का बिंदु जो आप डिफ़ॉल्ट सूची में विफल होने पर अपनी खुद की सीए फाइल पास कर सकते हैं।
jfs 7

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

42

$ pip install -U requests[security]

  • पायथन 2.7.6 @ Ubuntu 14.04.4 LTS पर परीक्षण किया गया
  • पायथन 2.7.5 @ MacOSX 10.9.5 (मावेरिक्स) पर परीक्षण किया गया

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

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


7
pip install -U requests[security] --no-cacheदो बार औरpip install certifi==2015.04.28
आमिर अब्रो

@alanjds क्या होगा यदि मैं स्रोत कोड को संपादित किए बिना, कुछ ssl प्रमाणपत्र पर भरोसा करने के लिए या प्रमाणपत्र सत्यापन को अक्षम करने के लिए या पर्यावरण में विश्व स्तर पर अजगर को कॉन्फ़िगर करना चाहता हूं? उदाहरण के लिए यदि मैं मौजूदा पायथन उपयोगिताओं (जैसे एडब्ल्यूएस सीएलआई) को डाउनलोड करता हूं और मैं उन उपकरणों के लिए प्रमाण पत्र सत्यापन पर विश्वास करना या अनदेखा करना चाहता हूं?
होवीकैंप

@ हाईवीकैंप तब आप jf-sebastian उत्तर से जा सकते हैं, मुझे लगता है: stackoverflow.com/a/12865159/798575
alanjds

@alanjds लेकिन उसका जवाब नहीं मान रहा है कि मैं कोड लिख रहा हूं और / या कोड तक पहुंच है? मैं इसे पर्यावरण स्तर पर लागू करना चाहता हूं।
होवीकैम्प

3
करते pip install --upgrade pipअनुरोध सुरक्षा पैकेज को स्थापित करने अन्य त्रुटियों से बचने के पहले
विन्सेंट क्लेस

40

मुझे एक ही मुद्दे का सामना करना पड़ा और ssl सर्टिफिकेट वेरिफाइड फेल हुआ जब aws boto3 का उपयोग करके समीक्षा की गई, boto3 कोड की समीक्षा करके, मैंने पाया कि REQUESTS_CA_BUNDLEयह सेट नहीं है, इसलिए मैंने इसे मैन्युअल रूप से सेट करके दोनों समस्या को ठीक किया:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

Aws-cli के लिए, मुझे लगता है कि सेटिंग REQUESTS_CA_BUNDLE ~/.bashrcइस समस्या को ठीक कर देगा (परीक्षण नहीं किया गया क्योंकि मेरे aws-cli इसके बिना काम करता है)।

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE

2
इससे मेरी समस्या ठीक हो गई! मैं चार्ल्स प्रॉक्सी का उपयोग कर रहा था मैक पर एक लाइब्रेरी को डीबग करने के लिए जिसने JSON को HTTPS API में कॉल किया। मैंने निर्धारत प्रमाणपत्र को निर्दिष्ट के रूप में स्थापित किया, इसे किचेन में जोड़ा, लेकिन पायथन के साथ असफल रहा: SSLError: ("खराब हैंडशेक: त्रुटि ((एसएसएल दिनचर्या), 'ssl3_get_cver_certificate', 'प्रमाणपत्र सत्यापित विफल')],") ,) इसे ठीक करने के लिए, मैंने REQUESTS_CA_BUNDLE को जोड़ने के बारे में आपकी सलाह का पालन किया और एक .pem फ़ाइल के रूप में अपने किचेन से चार्ल्स प्रमाणपत्र का निर्यात किया। अब यह काम कर रहा है!
मालवई

धन्यवाद, एक ही मुद्दा खोला Fiddler के साथ था
user565447

@ user565447 मैं अभी फिडलर के साथ यह काम करने की कोशिश कर रहा हूं। क्या FQUler के प्रमाणित कार्य के लिए REQUESTS_CA_BUNDLE सेट करना चाहिए?
होवीकैंप

19

यदि आपके पास एक पुस्तकालय है जो निर्भर करता है 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। @ अनुरोध-देवों, अनुरोध के साथ अपने स्वयं के कैसर्ट को बांधना वास्तव में, वास्तव में कष्टप्रद है ... विशेष रूप से तथ्य यह है कि आप सिस्टम सीए स्टोर का उपयोग पहले नहीं करते हैं और यह कहीं भी प्रलेखित नहीं है।

अपडेट करें

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

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

सौ बार यह: verifyपथ को संशोधित करने में असमर्थता ।
घुइल

यदि आप स्व हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहे हैं तो क्या होगा? उस मामले में सीए क्या होगा?
user1114

टाइनी अपडेट - पायथन 3.6 के लिए, प्रिंट कमांड के लिए कोष्ठक होना चाहिए - अजगर "आयात" अनुरोध, प्रिंट (रिक्वेस्ट
।certs.where

15

मैं एक ही समस्या का सामना कर रहा हूँ, और मेरे लिए ये कमांड काम करता है:

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

इसने मेरे लिए यह किया। धन्यवाद :)
एलेक्स-मसलोड

4
यह प्रमाणित किए गए पुराने संस्करण से संभावित रूप से निरस्त / अप्रमाणित प्रमाणपत्रों को फिर से स्थापित करने का नकारात्मक पक्ष है, अनुशंसित नहीं है।
197 पर ड्रैगन 788

अगर किसी कारण से आप 2.7 2.7 के शुरुआती संस्करण के साथ रहने के लिए मजबूर हो जाते हैं, तो सर्टिफिकेशन को अपग्रेड करना एकमात्र तरीका है जो मेरे लिए काम करता है
सीन्स

15

यदि आप चेतावनी निकालना चाहते हैं, तो नीचे दिए गए कोड का उपयोग करें।

import urllib3

urllib3.disable_warnings()

और विधि या विधि के verify=Falseसाथrequest.getpost


12

मुझे इसी तरह के मुद्दे को हल करने के लिए एक विशिष्ट दृष्टिकोण मिला है। यह विचार प्रणाली पर संग्रहीत कैसर्ट फ़ाइल को इंगित कर रहा है और एक अन्य एसएसएल आधारित अनुप्रयोगों द्वारा उपयोग किया जाता है।

डेबियन में (मुझे यकीन नहीं है कि अगर अन्य वितरणों में भी ऐसा ही हो) तो सर्टिफिकेट फाइलें (.pem) /etc/ssl/certs/सो पर स्टोर हो जाती हैं , यह वह कोड है जो मेरे लिए काम करता है:

import requests
verify='/etc/ssl/certs/cacert.org.pem'
response = requests.get('https://lists.cacert.org', verify=verify)

किस pemफ़ाइल का चयन किया जाता है, इसका अनुमान लगाने के लिए , मैंने url में ब्राउज़ किया है और यह जांचा है कि प्रमाणपत्र प्राधिकारी (CA) ने प्रमाणपत्र बनाया है या नहीं।

संपादित करें: यदि आप कोड को संपादित नहीं कर सकते हैं (क्योंकि आप एक तीसरा ऐप चला रहे हैं) तो आप pemसीधे प्रमाण पत्र को जोड़ने की कोशिश कर सकते हैं /usr/local/lib/python2.7/dist-packages/requests/cacert.pem(जैसे इसे फ़ाइल के अंत में कॉपी करना)।


2
अजगर द्वारा प्रयुक्त CA_BUNDLE डिबगिंग के लिए संबंधित पोस्ट
chk

/usr/local/lib/python2.7/dist-packages/requests/cacert.pemओएस स्टोर में एक सिम्लिंक के साथ बदलने के बारे में क्या ?
CMCDragonkai

8

यदि आप प्रमाण पत्र के बारे में परेशान नहीं करते हैं तो बस उपयोग करें verify=False

import requests

url = "Write your url here"

returnResponse = requests.get(url, verify=False)

7

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

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

का उपयोग करते हुए OpenSSL 1.0.2g 1 Mar 2016

इन पैकेजों के बिना verify=Falseकाम नहीं कर रहा था।

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


5

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

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

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

sudo apt-get install ca-certificates

समय का अद्यतन करना भी इसे हल कर सकता है:

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

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


ध्यान दें, यह केवल apt-get के जरिए रिक्वेस्ट इंस्टॉलेशन पर लागू होता है, जिसे सिस्टम सेर्ट्स का उपयोग करने के लिए Debian / Ubuntu द्वारा संशोधित किया जाता है। अपने स्वयं के साथ उचित जहाजों का अनुरोध करें, ध्यान से क्यूरेट करें, सीए बंडल: सर्टिफिकेट ।io
केनेथ रिट्ज

क्या रूट CA पर्याप्त नहीं होना चाहिए? आपको मध्यवर्ती की आवश्यकता क्यों है?
टिम्मी

5

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

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('Patched requests: SSL verification disabled!')

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


4

पार्टी के लिए बहुत देर हो चुकी है, लेकिन मुझे लगता है कि मैं अपने जैसे साथी भटकने वालों के लिए फिक्स पेस्ट करना चाहता था! तो पायथन 3.7.x पर निम्नलिखित ने मेरे लिए काम किया

अपने टर्मिनल में निम्नलिखित टाइप करें

pip install --upgrade certifi      # hold your breath..

अपनी स्क्रिप्ट / अनुरोधों को फिर से चलाने का प्रयास करें और देखें कि क्या यह काम करता है (मुझे यकीन है कि यह अभी तक तय नहीं किया जाएगा!)। अगर यह काम नहीं करता तो सीधे टर्मिनल में निम्न कमांड चलाने का प्रयास करें

open /Applications/Python\ 3.6/Install\ Certificates.command  # please replace 3.6 here with your suitable python version

3

मैंने HOURS के लिए यह समस्या लड़ी।

मैंने अनुरोधों को अपडेट करने का प्रयास किया। फिर मैंने सर्टिफिकेट अपडेट किया। मैंने प्रमाणित करने के लिए सत्यापन को इंगित किया। () (कोड डिफ़ॉल्ट रूप से यह करता है)। कुछ भी काम नहीं किया।

अंत में मैंने अजगर के अपने संस्करण को अजगर को 2.7.11 पर अद्यतन किया। मैं पाइथन २..5.५ पर था, जिसके प्रमाण पत्र सत्यापित होने के तरीके के साथ कुछ असंगतताएं थीं। एक बार जब मैंने पायथन को अपडेट किया (और कुछ अन्य आश्रितों के लिए) ने काम करना शुरू कर दिया।


यदि आपने OpenSSL को संस्करण> 1.0.1 में अपडेट किया है, तो शायद यह समस्या थी। मेरा उत्तर देखिए stackoverflow.com/a/44543047/1413201
टिम लुड्विंस्की

पाइथन 2.7.9 से 2.7.10 पर जाना मेरे लिए यह तय है।
crazystick

3

यह @ राफेल-अलमेडा के उत्तर के समान है, लेकिन मैं यह बताना चाहता हूं कि अनुरोधों के अनुसार 2.11+ में, 3 मान नहीं verifyहैं जो वास्तव में ले सकते हैं, वास्तव में 4 हैं:

  • True: अनुरोधों के आंतरिक विश्वसनीय सीए के खिलाफ मान्य करता है।
  • False: प्रमाण पत्र सत्यापन को पूरी तरह से बायपास करता है । (सिफारिश नहीं की गई)
  • एक CA_BUNDLE फ़ाइल का पथ। अनुरोध इसका उपयोग सर्वर के प्रमाणपत्रों को मान्य करने के लिए करेंगे।
  • सार्वजनिक प्रमाणपत्र फ़ाइलों वाली निर्देशिका का पथ। अनुरोध इसका उपयोग सर्वर के प्रमाणपत्रों को मान्य करने के लिए करेंगे।

मेरा बाकी का उत्तर # 4 के बारे में है, एक निर्देशिका का उपयोग कैसे करें प्रमाण पत्र को मान्य करने के लिए:

आवश्यक सार्वजनिक प्रमाणपत्र प्राप्त करें और उन्हें एक निर्देशिका में रखें।

कड़ाई से बोलते हुए, आपको संभवतः प्रमाणपत्र प्राप्त करने की एक आउट-ऑफ-द-बैंड विधि का उपयोग करना चाहिए, लेकिन आप केवल अपने ब्राउज़र का उपयोग करके उन्हें भी डाउनलोड कर सकते हैं।

यदि सर्वर एक प्रमाणपत्र श्रृंखला का उपयोग करता है, तो श्रृंखला में प्रत्येक एकल प्रमाण पत्र प्राप्त करना सुनिश्चित करें।

अनुरोधों के दस्तावेज़ीकरण के अनुसार, प्रमाण-पत्र वाली निर्देशिका को पहले "रेहश" उपयोगिता ( openssl rehash) के साथ संसाधित किया जाना चाहिए ।

(इसके लिए Opensl 1.1.1+ की आवश्यकता होती है, और सभी विंडोज के खुलने के कार्यान्वयन rehash का समर्थन openssl rehashनहीं करते हैं । यदि आपके लिए काम नहीं करेगा, तो आप https://github.com/ruby/openssl/nlob/master पर rehash माणिक स्क्रिप्ट चलाने का प्रयास कर सकते हैं। /sample/c_rehash.rb , हालांकि मैंने यह कोशिश नहीं की है।)

मुझे अपने प्रमाणपत्रों को पहचानने के अनुरोध प्राप्त करने में थोड़ी परेशानी हुई, लेकिन मैंने openssl x509 -outform PEMआदेशों को आधारों को बेस 64 .pemप्रारूप में बदलने के लिए उपयोग करने के बाद , सब कुछ पूरी तरह से काम किया।

तुम भी आलसी rehashing कर सकते हैं:

try:
    # As long as the certificates in the certs directory are in the OS's certificate store, `verify=True` is fine.
    return requests.get(url, auth=auth, verify=True)
except requests.exceptions.SSLError:
    subprocess.run(f"openssl rehash -compat -v my_certs_dir", shell=True, check=True)
    return requests.get(url, auth=auth, verify="my_certs_dir")

2

वर्तमान में अनुरोध मॉड्यूल में इस समस्या के कारण एक समस्या है, जो 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'


FWIW, यह अभी भी अनुरोधों के साथ मौजूद है == 2.13.0। उपरोक्त वर्कअराउंड इसे अभी भी ठीक करता है।
तमसे सजेलेई

1

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


0

यदि अन्य पैकेज से अनुरोध किया जा रहा है तो विकल्प जोड़ना संभव नहीं है। उस मामले में कैसर्ट बंडल में प्रमाण पत्र जोड़ना सीधा रास्ता है, उदाहरण के लिए मुझे "StartCom Class 1 Primary Intermediate Server CA" को जोड़ना था, जिसके लिए मैंने StartComClass1.pem में रूट सर्टिफिकेट डाउनलोड किया। दिए गए मेरे virtualenv को caldav नाम दिया गया है, मैंने इसके साथ प्रमाणपत्र जोड़ा:

cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem
cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem

उनमें से एक पर्याप्त हो सकता है, मैंने जांच नहीं की


0

मुझे एक समान या एक ही प्रमाणीकरण सत्यापन समस्या हो रही थी। मैंने पढ़ा कि ओपनएसएसएल संस्करण 1.0.2 से कम हैं, जो अनुरोधों पर निर्भर करता है कि कभी-कभी मजबूत प्रमाणपत्रों को सत्यापित करने में परेशानी होती है ( यहां देखें )। CentOS 7 का उपयोग करने के लिए लगता है 1.0.1e जो समस्या है लगता है।

मुझे यकीन नहीं था कि CentOS पर इस समस्या को कैसे हल किया जा सकता है, इसलिए मैंने कमजोर 1024bit CA प्रमाणपत्रों की अनुमति देने का निर्णय लिया।

import certifi # This should be already installed as a dependency of 'requests'
requests.get("https://example.com", verify=certifi.old_where())

मैं आर्कगिस द्वारा स्थापित पायथन 2.7.10 का उपयोग करता हूं और कोई प्रमाणित मॉड्यूल स्थापित नहीं है। इंस्टॉल किए गए अनुरोध मॉड्यूल संस्करण 2.11.1 में है।
लुकास

0

मुझे पायथन 3.4.0 से 3.4.6 तक अपग्रेड करना पड़ा

pyenv virtualenv 3.4.6 myvenv
pyenv activate myvenv
pip install -r requirements.txt

0

मेरे मामले में कारण काफी तुच्छ था।

मुझे पता था कि एसएसएल सत्यापन ने कुछ दिन पहले तक काम किया था, और एक अलग मशीन पर काम कर रहा था।

मेरा अगला चरण उस मशीन के बीच प्रमाणपत्र सामग्री और आकार की तुलना करना था, जिस पर सत्यापन कार्य कर रहा था, और जिस पर वह नहीं था।

इसने मुझे जल्दी से यह निर्धारित करने के लिए प्रेरित किया कि 'गलत तरीके से' काम करने वाली मशीन पर प्रमाणपत्र अच्छा नहीं था, और एक बार जब मैंने इसे 'अच्छे' प्रमाण पत्र के साथ बदल दिया, तो सब कुछ ठीक था।

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