urllib और "SSL: CERTIFICATE_VERIFY_FAILED" त्रुटि


279

मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in        __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in  run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

यह वह कोड है जो यह त्रुटि पैदा कर रहा है:

if input.startswith("!web"):
    input = input.replace("!web ", "")      
    url = "https://domainsearch.p.mashape.com/index.php?name=" + input
    req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
    info = urllib2.urlopen(req).read()
    Message.Chat.SendMessage ("" + info)

मैं जिस API का उपयोग कर रहा हूं, मुझे HTTPS का उपयोग करने की आवश्यकता है। मैं सत्यापन को बायपास कैसे कर सकता हूं?


2
URL में कुछ भी गलत नहीं है और इसे सामान्य विश्वसनीय प्रमाणपत्रों के साथ सफलतापूर्वक सत्यापित किया जा सकता है। इसलिए आपको प्रमाणपत्र सत्यापन को दरकिनार करने की कोशिश नहीं करनी चाहिए, बल्कि इसे ठीक करना चाहिए। अजगर का कौन सा संस्करण आप उपयोग कर रहे हैं?
स्टीफन उलरिच

यह stackoverflow.com/a/27826829/3081018 से संबंधित हो सकता है । सर्वर कई ट्रस्ट पथ के साथ एक ही प्रकार की प्रमाणपत्र श्रृंखला का उपयोग करता है। देखें कि सत्यापन के लिए आपको किस कैफ़ाइल का उपयोग करना पड़ सकता है।
स्टेफेन उरिक्रीच

7
यह त्रुटि Python 3.5 पर yosemite में उन्नयन के बाद भी होती है
pyCthon

2
इससे स्थिति स्पष्ट होती है। access.redhat.com/articles/2039753
चार्ली बर्न्स

4
"मैं सत्यापन को कैसे दरकिनार कर सकता हूं?" गलत सवाल है। आपको संभवतः यह पूछना चाहिए कि डोमेन द्वारा प्रदान किए गए प्रमाण पत्र को कैसे मान्य किया जाए।
jww

जवाबों:


296

अगर तुम केवल सत्यापन को बायपास करना चाहते हैं, तो आप एक नया SSLContext बना सकते हैं । डिफ़ॉल्ट रूप से नव निर्मित संदर्भ CERT_NONE का उपयोग करते हैं

धारा 17.3.7.2.1 में बताए अनुसार इससे सावधान रहें

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

लेकिन अगर आप अभी चाहते हैं कि यह किसी अन्य कारण से आप निम्नलिखित कार्य कर सकते हैं, तो आपको करना होगा import ssl :

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

यह आपकी समस्या को गोल करना चाहिए, लेकिन आप वास्तव में किसी भी मुद्दे को हल नहीं कर रहे हैं, लेकिन आप नहीं देखेंगे [SSL: CERTIFICATE_VERIFY_FAILED]क्योंकि आप अब प्रमाणपत्र को सत्यापित नहीं कर रहे हैं!

उपरोक्त जोड़ने के लिए, यदि आप इस बारे में अधिक जानना चाहते हैं कि आप इन मुद्दों को क्यों देख रहे हैं तो आप एक नज़र रखना चाहेंगे PEP 476

यह पीईपी X509 प्रमाणपत्र हस्ताक्षर के सत्यापन को सक्षम करने का प्रस्ताव करता है, साथ ही साथ डिफ़ॉल्ट रूप से पायथन के HTTP क्लाइंट के लिए होस्टनाम सत्यापन, प्रति-कॉल आधार पर ऑप्ट-आउट के अधीन है। यह परिवर्तन Python 2.7, Python 3.4 और Python 3.5 पर लागू होगा।

एक सलाह दी गई है जो मेरी सलाह से ऊपर नहीं है

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

यह बंदर पकड़ने के माध्यम से एक अत्यधिक हतोत्साहित विकल्प भी पेश करता है जिसे आप अक्सर अजगर में नहीं देखते हैं:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

जो एक असत्यापित संदर्भ बनाने के लिए फ़ंक्शन के साथ संदर्भ निर्माण के लिए डिफ़ॉल्ट फ़ंक्शन को ओवरराइड करता है।

कृपया इसे पीईपी में बताए अनुसार ध्यान दें:

यह मार्गदर्शन मुख्य रूप से सिस्टम प्रशासकों के उद्देश्य से है जो पायथन के नए संस्करणों को अपनाना चाहते हैं जो इस पीईपी को विरासत के वातावरण में लागू करते हैं जो अभी तक HTTPS कनेक्शन पर प्रमाणपत्र सत्यापन का समर्थन नहीं करते हैं। उदाहरण के लिए, एक व्यवस्थापक पायथन के लिए अपने मानक ऑपरेटिंग वातावरण में sitecustomize.py के ऊपर बंदरपंख को जोड़कर चुन सकता है। अनुप्रयोग और पुस्तकालय SHOULD इस परिवर्तन प्रक्रिया को व्यापक नहीं बना सकते (सिवाय सिस्टम प्रशासक नियंत्रित विन्यास सेटिंग के जवाब में) को छोड़कर।

यदि आप एक कागज को पढ़ना चाहते हैं, तो क्यों नहीं मान्य वेरेट सॉफ्टवेयर में खराब है आप इसे यहां पा सकते हैं !


1
तो अगर यह त्रुटि मुझे उपयोग setup.py uploadकरने से रोक रही है तो मैं इसे कैसे ठीक कर सकता हूं?
पाइथॉन

5
ssl। जैसा कि हमारा एचपी प्रिंटर के लिए एक इंट्रानेट साइट है ... विशुद्ध रूप से स्क्रैपिंग के लिए उपयोग किया जाता है ... हमारे पास इस पद्धति का उपयोग करने के साथ कोई समस्या नहीं है।
इह्तोवर

आप पहली विधि कम से कम वांछनीय एक - बायपास सत्यापन है। ऐसा क्यों है जो वास्तव में पहले सूचीबद्ध नहीं किए गए प्रमाण पत्र को मान्य करता है?
jww

1
यह तब भी हो सकता है जब आपके पास ओपनएसएसएल का एक अतिरिक्त संस्करण हो। तो मेरे लिए जो काम किया गया certifi वह बॉक्स के सबसे हाल के संस्करण के लिए अद्यतन हो रहा था और बक्से पर खुलता है।
myusuf3

1
context मैं क्या जरूरत है
प्रयागपद

382

यह आपकी विशिष्ट समस्या का समाधान नहीं है, लेकिन मैं इसे यहां रख रहा हूं क्योंकि यह धागा "SSL: CERTIFICATE_VERIFY_FAILED" के लिए शीर्ष Google परिणाम है, और यह मुझे एक जंगली हंस पीछा करता है।

यदि आपने OSX पर Python 3.6 स्थापित किया है और किसी https: // साइट से कनेक्ट करने का प्रयास करते समय "SSL: CERTIFICATE_VERIFY_FAILED" त्रुटि हो रही है, तो शायद यह है क्योंकि OSX पर Python 3.6 के पास कोई प्रमाण पत्र नहीं है और किसी भी SSL को मान्य नहीं कर सकता है। सम्बन्ध। यह OSX पर 3.6 के लिए एक बदलाव है, और इसके लिए एक पोस्ट-इंस्टॉल कदम की आवश्यकता होती है, जो certifiप्रमाण पत्र के पैकेज को स्थापित करता है । यह रीडमी में प्रलेखित है, जिसे आपको ढूंढना चाहिए/Applications/Python\ 3.6/ReadMe.rtf

ReadMe आपके पास इस पोस्ट-इंस्टाल स्क्रिप्ट को चलाएगा, जो अभी स्थापित है certifi:/Applications/Python\ 3.6/Install\ Certificates.command

जारी नोट में कुछ और जानकारी है: https://www.python.org/downloads/release/python-360/


105
सीधे रन / एप्लीकेशन / पायथन \ 3.6 / इंस्टाल \ सर्टिफिकेट .मैन्ड ओएसएक्स पर मेरी समस्या का समाधान करते हैं। धन्यवाद।
मूयंग

2
मैं OS X El Capitan 10.11.6, Python 3.6.0 का उपयोग कर रहा हूं और इस समाधान ने पूरी तरह से काम किया है।
y2knoproblem

2
मैं macOS सिएरा 10.12.5, पायथन 3.6.1 का उपयोग कर रहा हूं और यह समाधान पूरी तरह से काम करता है।
जेम्स

4
यह मेरे लिए इसे /Applications/Python\ 3.7/Install\ Certificates.command सीधे चलाने में तय किया terminal! धन्यवाद @CraigGlennie & @muyong मैं out-of-the-box-thinkingइसे यहाँ रखने के लिए सराहना करता हूँ !
JayRizzo

6
MacOS Mojave पर पायथन 3.7: यह यहाँ काम नहीं करता है। मैंने स्थापना प्रमाणपत्र को अनइंस्टॉल / रीइंस्टॉल / रन किया है, रिबूट किया गया है, आदि .. मेरे लिए काम नहीं करता है
थॉमस

71

क्रेग ग्लेनी के जवाब पर विस्तार करने के लिए:

MacOs Sierra पर Python 3.6.1 में

इसे बैश टर्मिनल में दर्ज करने से समस्या हल हो गई:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command

3
sudo /Applications/Python\ 3.6/Install\ Certificates.commandयदि अनुमतियाँ अस्वीकृत हैं, तो प्रयास करें ।
KingKongCoder

यह वास्तव में पायथन 3.6 पर समस्या को ठीक नहीं करता है। -1
हाइपरम

1
यदि कमांड लाइन का उपयोग करने से आप बाहर निकलते हैं (शायद आप यहां नहीं हैं, लेकिन हे), तो आप एप्लिकेशन फ़ोल्डर (या अन्य ओएस पर समतुल्य) भी पा सकते हैं जिसे पायथन ने इंस्टॉलेशन पर बनाया है, फिर डबल क्लिक करके स्क्रिप्ट खोलें। फ़ोल्डर का विशिष्ट नाम आपके द्वारा इंस्टॉल किए गए पायथन के संस्करण पर निर्भर करता है।
Erd ats-Bacon

पायथन 3.7.3 के लिए एक आकर्षण की तरह काम किया। धन्यवाद।
klbytec

धन्यवाद। मैंने सचमुच 100 समाधानों की खोज की और आपका काम किया।
nnd

43

विंडोज पर, पायथन सिस्टम प्रमाण पत्र को नहीं देखता है, यह अपने स्वयं के स्थित का उपयोग करता है ?\lib\site-packages\certifi\cacert.pem

आपकी समस्या का हल:

  1. डोमेन सत्यापन प्रमाणपत्र को * .crt या * pem फ़ाइल के रूप में डाउनलोड करें
  2. फ़ाइल को संपादक में खोलें और उसे क्लिपबोर्ड पर कॉपी करें
  3. अपना cacert.pemस्थान खोजें:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. संपादित करें cacert.pemफ़ाइल को फ़ाइल के अंत में अपना डोमेन सत्यापन प्रमाणपत्र पेस्ट करें।
  5. फ़ाइल सहेजें और अनुरोधों का आनंद लें!

6
lib\site-packages\certifi\cacert.pemपाइथन 2.7.10 में मौजूद नहीं है। और सवाल यह urllib2नहीं हैrequests
केविन स्मिथ

2
अब तक का सबसे अच्छा समाधान, ट्विटर एपीआई DigiCert प्रमाण पत्र का उपयोग करता है जो कि मेरे अजगर की cacert.pem फ़ाइल में नहीं है। मैंने वहाँ जोड़ा और VOILA!
digz6666

2
डेबियन पर काम किया। रिकॉर्ड के लिए, अपने सिस्टम पर फ़ाइल पथ था: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem। धन्यवाद!
इवेरे

दुर्भाग्य से अजगर के अनुरोध किसी भी ऑपरेटिंग सिस्टम के सीए ट्रस्ट स्टोर का उपयोग नहीं करते हैं। github.com/requests/requests/issues/2966 । आपको REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 सेट करना होगा ।
जामशीद

Google और ट्विटर एपीआई और सामान्य रूप में अनुरोध मॉड्यूल के साथ विंडोज 10, पायथन 3.6 पर काम करता है।
ब्रेटनब

36

मैक ओएस एक्स के लिए मेरा समाधान:

1) आधिकारिक ऐप पाइथन भाषा की वेबसाइट https://www.python.org/downloads/ से डाउनलोड किए गए देशी ऐप Python इंस्टॉलर का उपयोग करके Python 3.6.5 पर अपग्रेड करें।

मैंने पाया है कि यह इंस्टॉलर नए पाइथन के लिए लिंक और सिमिलिंक को अपडेट करने का ध्यान रख रहा है, जो कि होमब्रे से काफी बेहतर है।

2) "./stall सर्टिफिकेट डॉट कॉम" का उपयोग करके एक नया प्रमाणपत्र स्थापित करें जो ताज़ा किए गए पायथन 3.6 निर्देशिका में है

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"

मैक ओएस एक्स में आकर्षण की तरह काम किया।
मनु मैथ्यू

31

आप इसे अपने पर्यावरण चर में जोड़ने का प्रयास कर सकते हैं:

PYTHONHTTPSVERIFY=0 

ध्यान दें कि यह सभी HTTP सत्यापन को अक्षम कर देगा इसलिए थोड़ा सा स्लेजहैमर दृष्टिकोण है, हालांकि यदि सत्यापन की आवश्यकता नहीं है तो यह एक प्रभावी समाधान हो सकता है।


17
मुझे संदेह है कि सभी अजगर के लिए सभी HTTP सत्यापन को अक्षम करना सत्यापन में एक त्रुटि से निपटने के लिए थोड़ा अधिक है। ऐसे कई मामले हैं जिनमें कोई डिफ़ॉल्ट रूप से सत्यापन करना चाहता है।
trevorKirkby

मेरे लिए विंडोज सर्वर 2016 पर अजगर 2.7.13 पर काम किया। मेरे पास सामान्य रूप से विंडोज़ सर्वर पर अजगर स्थापित नहीं है, लेकिन इसके लिए नेक्सस 1000V के साथ VDS के उन्नयन के लिए VDS की आवश्यकता है, और यह समय के लिए एक स्व-हस्ताक्षरित vCenter प्रमाण पत्र के साथ समस्या को ठीक करता है (VMCA और मान्य वोल्ट का उपयोग करेगा) उन्नत वातावरण)। मेरे पास कोई सौभाग्य नहीं था कि अजगर अनुरोध पैकेज में cacert.pem का संपादन करके स्वीकार किए जाने वाले प्रमाणपत्र को प्राप्त कर सकता है
क्रिस्टोफर थोरजूसन

3
इसके अलावा, मैं स्क्रिप्ट को चलाने से पहले वेरिएबल को सीधे कमांड लाइन विंडो में सेट करता हूं, इसलिए यह @ चेक को डिसेबल नहीं करेगा जैसे @ कोई-या-अन्य को डर लगता है, जिसकी मैं सिफारिश नहीं करता।
क्रिस्टोफर थोरजूसन

यह मेरे उपयोग के मामले के लिए एकदम सही है: परीक्षण। मैं उत्पादन पर ऐसा कभी नहीं करूंगा, लेकिन उन परीक्षणों को चलाने के लिए जिनका एसएसएल के साथ कोई लेना-देना नहीं है, यह एक बढ़िया विकल्प है।
सोरिन

धन्यवाद, इस समाधान ने मेरे लिए यह किया: आयात os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello

28

मुझे एक समान समस्या हो रही थी, हालांकि मैं पायथन 3.4, 3.5 और 3.6urllib.request.urlopen में उपयोग कर रहा था । (यह पायथन 2 के प्रलेखन पृष्ठ के शीर्ष पर नोट के बराबर पायथन 3 का एक हिस्सा है ।)urllib2urllib2

मेरा समाधान pip install certifiस्थापित करना था certifi, जिसमें है:

... TLS होस्ट की पहचान की पुष्टि करते हुए SSL प्रमाणपत्र की विश्वसनीयता को सत्यापित करने के लिए रूट प्रमाणपत्रों का सावधानीपूर्वक संग्रहित संग्रह।

फिर, मेरे कोड में जहां मैं पहले सिर्फ था:

import urllib.request as urlrq

resp = urlrq.urlopen('https://example.com/bar/baz.html')

मैंने इसे संशोधित किया:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

अगर मैं urllib2.urlopenप्रलेखन को सही ढंग से पढ़ता हूं , तो इसका एक cafileतर्क भी है । तो, urllib2.urlopen([...], certifi.where())अजगर 2.7 के लिए भी काम कर सकता है।


अद्यतन (2020/01/01): अजगर 3.6 के रूप में, करने के लिए तर्क पदावनत किया गया है , के साथ तर्क माना बजाय निर्दिष्ट किया जाना है। मुझे 3.8 के माध्यम से 3.5 पर समान रूप से काम करने के लिए निम्नलिखित मिला:cafileurlopencontext

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))

1
load_verify_locationsSSLContextउदाहरण और रिटर्न को बदल देता है None। आपको context=ssl.create_default_context(cafile=certifi.where())इसके बजाय उपयोग करना चाहिए । अधिक जानकारी के लिए sslडॉक्स देखें ।
ओस्ट्रोकैच

1
@ostrokach हुह, मैंने ऐसा कुछ करने की कोशिश की, लेकिन मैंने गलत sslफ़ंक्शन का उपयोग किया होगा । संपादित देखें; ठीक?
hBy2Py

13
import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

यहाँ से लिया गया https://gist.github.com/michaelrice/a6794a017e349fc65d01


Jenkins पर्यावरण, व्यक्तिगत वातावरण में इस समाधान का परीक्षण किया, यह काम करता है!
rapport89

2
यह अत्यंत असुरक्षित है क्योंकि यह सभी प्रमाणपत्र सत्यापन को बायपास करता है, अपने जोखिम पर उपयोग करें और किसी भी तरह के प्यार के लिए उत्पादन कोड में इसका उपयोग न करें।
ड्रैगन 88 --88

धन्यवाद। अंत में यह काम किया। यह आवश्यक नहीं है कि मैक ओएस पर पायथन 3.6 / एप्लिकेशन के तहत इंस्टॉल किया गया हो। यह स्वीकृत उत्तर होना चाहिए।
बिरंची

आपको कभी भी इस तरह के मंकीपिंग नहीं करने चाहिए। यह बेहद खतरनाक है और कोड के सभी डाउनस्ट्रीम उपयोग को प्रभावित करेगा।
एक्यूमेनस

10

जैसे मैंने एक टिप्पणी में लिखा है, यह समस्या संभवतः इस SO उत्तर से संबंधित है ।

संक्षेप में: प्रमाणपत्र को सत्यापित करने के कई तरीके हैं। OpenSSL द्वारा उपयोग किया गया सत्यापन आपके सिस्टम पर आपके द्वारा दिए गए विश्वसनीय रूट प्रमाणपत्रों के साथ असंगत है। ओपनएसएसएल का उपयोग पायथन द्वारा किया जाता है।

आप वेरिसाइन क्लास 3 पब्लिक प्राइमरी सर्टिफिकेशन अथॉरिटी के लिए लापता प्रमाण पत्र प्राप्त करने की कोशिश कर सकते हैं और फिर पायथन प्रलेखन केcafile अनुसार विकल्प का उपयोग कर सकते हैं :

urllib2.urlopen(req, cafile="verisign.pem")

क्या आप मुझे अजगर और एसएसएल सत्यापन लिंक
कोई नहीं

8

मेरी एक लिनक्स मशीन पर मुझे इसी तरह की समस्या थी। नए प्रमाणपत्र बनाना और प्रमाण पत्र निर्देशिका की ओर इशारा करते हुए एक पर्यावरण चर का निर्यात करना मेरे लिए इसे तय किया:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs

7

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

मैं MacPorts का उपयोग कर रहा हूं, और जो मैंने मूल रूप से सोचा था कि एक पायथन समस्या थी वास्तव में एक MacPorts समस्या थी: यह ओपनस्स्ल की स्थापना के साथ एक रूट प्रमाणपत्र स्थापित नहीं करता है। इसका समाधान इस ब्लॉग पोस्टport install curl-ca-bundle में बताया गया है ।


5

मैंने इसे यहाँ पाया है

मुझे यह समाधान मिला, इस कोड को अपनी स्रोत फ़ाइल की शुरुआत में डालें:

import ssl

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

यह कोड सत्यापन को पूर्ववत करता है ताकि ssl प्रमाणीकरण सत्यापित न हो।


इस वीडियो को देखें इससे मुझे यह समझने में मदद मिली कि एसएसएल क्या है। वीडियो URL: youtu.be/dsuVPxuU_hc
गणेश चौधरी सदनला

4

सेंटोस 6/7 , फेडोरा पर पायथन 3.4+ के लिए , बस विश्वसनीय सीए को इस तरह से स्थापित करें:

  1. CA.crt को कॉपी करें /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract

2
मूर्खतापूर्ण प्रश्न हो सकता है, लेकिन CA.crt क्या है और मुझे यह कहां मिल सकता है?
इकबाल

4

एनाकोंडा के लिए समाधान

मेरा सेटअप एक प्रॉक्सी के साथ MacOS पर एनाकोंडा पायथन 3.7 है। रास्ते अलग हैं।

  • यह है कि आपको सही प्रमाणपत्र पथ कैसे मिलता है :
import ssl
ssl.get_default_verify_paths()

जो मेरे सिस्टम पर निर्मित हुआ

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
 openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
 openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

एक बार जब आप जानते हैं कि प्रमाण पत्र कहां जाता है, तो आप सहमति देते हैं है कि फाइल के अंत करने के लिए प्रॉक्सी द्वारा प्रयोग किया जाता प्रमाण पत्र।

मैंने पहले से ही अपने प्रॉक्सी के साथ काम करने के लिए कोंडा की स्थापना की थी,

conda config --set ssl_verify <pathToYourFile>.crt

यदि आपको याद नहीं है कि आपका प्रमाण पत्र कहां है, तो आप इसमें पा सकते हैं ~/.condarc:

ssl_verify: <pathToYourFile>.crt

अब जोड़ के अंत के लिए उस फ़ाइल/miniconda3/ssl/cert.pem और अनुरोधों काम करना चाहिए, और विशेष रूप सेsklearn.datasets और इसी तरह के उपकरणों काम करना चाहिए।

आगे कैविट्स

एनाकोंडा सेटअप थोड़ा अलग है क्योंकि अन्य समाधान काम नहीं करते हैं:

  • रास्ता Applications/Python\ 3.Xबस मौजूद नहीं है।

  • नीचे दिए गए आदेशों के अनुसार पथ गलत पथ है

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH

3

मैं अपना सिर अर्ध-शर्म में लटका देता हूं, क्योंकि मेरे पास एक ही मुद्दा था, इसके अलावा मेरे मामले में, जिस URL को मैं मार रहा था वह वैध था, प्रमाण पत्र मान्य था। जो मान्य नहीं था, वह वेब से मेरा कनेक्शन था। मैं ब्राउज़र (इस मामले में IE) में प्रॉक्सी विवरण जोड़ने में विफल रहा था। इसने सत्यापन प्रक्रिया को सही तरीके से होने से रोक दिया।
प्रॉक्सी विवरणों में जोड़ा गया और मेरा अजगर तब बहुत खुश था।


1
किसी चीज़ को भूलने के लिए अपना सिर शर्म से न झुकाएँ और फिर उसे समझकर साझा करें, किसी को वह उपयोगी लग सकता है। IE का उपयोग करते हुए ... शर्म की बात है: पी
दावोस

3

पायथन 2.7.12 (डिफ़ॉल्ट, जुलाई 29 2016, 15:26:22) ने उल्लेखित मुद्दा तय किया। यह जानकारी किसी और की मदद कर सकती है।


3
मुझे इसका सामना करना पड़ा 2.7.12 को मैक पर, urllib2 लाइब्रेरी का उपयोग करके, आवश्यक लाइब्रेरी का उपयोग करके ठीक लगता है
marcadian

@marcadian स्थापना और उपयोग certifi, जो स्पष्ट रूप से आयोजित प्रमाण पत्र का एक परिमार्जन है requests, मेरे लिए पायथन 3.4 से 3.6 पर समस्या निर्धारित की गई
hBy2Py

3

मुझे आश्चर्य है कि इन सभी निर्देशों से मेरी समस्या हल नहीं हुई। फिर भी, निदान सही है (BTW, मैं मैक और पायथन 3.6.1 का उपयोग कर रहा हूं)। तो, सही भाग को संक्षेप में प्रस्तुत करने के लिए:

  • मैक पर, Apple OpenSSL छोड़ रहा है
  • अजगर अब इसे CA रूट सर्टिफिकेट के सेट का उपयोग करता है
  • बाइनरी पायथन इंस्टॉलेशन ने सीए रूट सर्टिफिकेट पाइथन की जरूरतों को स्थापित करने के लिए एक स्क्रिप्ट प्रदान की ("/ एप्लीकेशन / पायथन 3.6 / इंस्टाल सर्टिफिकेट.कॉम")
  • विवरण के लिए "/ अनुप्रयोग / पायथन 3.6 / ReadMe.rtf" पढ़ें

मेरे लिए, स्क्रिप्ट काम नहीं करती है, और वे सभी सर्टिफिकेट और ओप्सनल इंस्टॉलेशन भी ठीक करने में विफल रहे। हो सकता है क्योंकि मेरे पास कई पायथन 2 और 3 इंस्टॉलेशन हैं, साथ ही कई वर्चुअन भी हैं। अंत में, मुझे इसे हाथ से ठीक करने की आवश्यकता है।

pip install certifi   # for your virtualenv
mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl
cp -a <your virtualenv>/site-package/certifi/cacert.pem \
  /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

अगर वह अभी भी आपको विफल करता है। फिर ओपनएसएसएल को भी पुनः स्थापित / स्थापित करें।

port install openssl

2

आपकी तरह, मैं अपने पुराने iMac (OS X 10.6.8) पर अजगर 2.7 का उपयोग कर रहा हूं, मुझे urllib2.urlopen का उपयोग करते हुए, समस्या भी मिली।

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

मेरे कार्यक्रम एसएसएल प्रमाणपत्र समस्याओं के बिना ठीक चल रहे थे और अचानक (प्रोग्राम लोड करने के बाद), वे एसएसएल त्रुटि के साथ दुर्घटनाग्रस्त हो गए।

समस्या अजगर के संस्करण का इस्तेमाल किया गया था:

  1. Https://www.python.org/downloads और python-2.7.9-macosx10.6.pkg के साथ कोई समस्या नहीं है

  2. होमब्रेव टूल द्वारा इंस्टाल किए गए एक समस्या के साथ : "काढ़ा स्थापित करें अजगर", / usr / स्थानीय / बिन में स्थित संस्करण।

एक अध्याय, बुलाया Certificate verification and OpenSSL [CHANGED for Python 2.7.9], में/Applications/Python 2.7/ReadMe.rtf कई विवरण के साथ समस्या बताते हैं।

तो, अपने पेटीएम के सही संस्करण को जांचें, डाउनलोड करें और डालें।


2

अमेज़न EC2 पर पायथन 2.7 सेंटोस 7 के साथ

मुझे SSL_CERT_DIRअपने को इंगित करने के लिए env वैरिएबल सेट करना ca-bundleथा जो कि उस स्थान पर स्थित था/etc/ssl/certs/ca-bundle.crt


तुम जवाब दो मुझे मेरे लिए सही रास्ते पर ले गए। उबंटू पर, मुझे सेट SSL_CERT_DIRकरना पड़ा /etc/ssl/certs, और यह भी सुनिश्चित किया कि ca-certificatesपैकेज स्थापित किया गया था और आज तक है।
नॉर्मन ब्रेउ


1

प्रयत्न

पाइप इंस्टाल - trusted-host pypi.python.org packagename

इसने मेरे लिए काम किया।


1

पर एक नज़र डालें

/ एप्लीकेशन / पायथन 3.6 / स्थापित करें

आप प्रमाण पत्र पर भी जा सकते हैं


1

मेरे मामले में मैं इस त्रुटि हो रही थी क्योंकि requestsऔर urllib3संस्करणों असंगत थे, स्थापना के दौरान निम्न त्रुटि दे रही है:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

चाल चली।


1

एक और एनाकोंडा समाधान। मैं अपने Python 2.7 वातावरण में MacOS पर CERTIFICATE_VERIFY_FAILED प्राप्त कर रहा था। यह पता चला है कि कोंडा मार्ग खराब थे:

आधार (3.7) पर्यावरण:

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 पर्यावरण (पथ मौजूद नहीं था!):

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

जोड़:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem

1

SSL: CERTIFICATE_VERIFY_FAILED त्रुटि इसलिए भी हो सकती है क्योंकि ca-certificatesलिनक्स पर पैकेज में एक इंटरमीडिएट प्रमाणपत्र गायब है । उदाहरण के लिए, मेरे मामले में मध्यवर्ती प्रमाण पत्र " DigiCert SHA2 Secure Server CA " ca-certificatesफ़ायरफ़ॉक्स ब्राउज़र को शामिल करते हुए भी पैकेज में गायब था । आप यह पता लगा सकते हैं wgetकि URL पर सीधे कमांड चलाने से कौन सा प्रमाणपत्र गायब है , जिससे यह त्रुटि हुई है। फिर आप सर्टिफिकेट अथॉरिटी की आधिकारिक वेबसाइट (जैसे https://www.digicert.com/digicert-root-cert प्रमाणपत्र.htm) से इस सर्टिफिकेट के लिए CRT फाइल के संबंधित लिंक को खोज सकते हैं । अब, आपके मामले में गायब होने वाले प्रमाण पत्र को शामिल करने के लिए, आप अपने CRT फ़ाइल डाउनलोड लिंक के बजाय नीचे दिए गए कमांड चला सकते हैं:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

इसके बाद आप wgetअपने URL के साथ-साथ अजगर urllibपैकेज का उपयोग करके फिर से परीक्षण कर सकते हैं । अधिक जानकारी के लिए, देखें: https://bugs.launchpad.net/ubuntu/+source/ca-certports/+bug/1795242


0

यदि आपका vCenter 6 पर है, तो आपको इसके बजाय अपने OS के विश्वसनीय CA की सूची में अपने vCenter के vmware प्रमाणपत्र प्राधिकारी प्रमाणपत्र को जोड़ना चाहिए। अपना प्रमाणपत्र डाउनलोड करने के लिए निम्नलिखित कार्य करें

  1. अपना वेब ब्राउज़र खोलें।
  2. Https: // पर नेविगेट करें
  3. निचले दाएं कोने में, डाउनलोड ट्रस्टेड रूट CA लिंक पर क्लिक करें

फेडोरा पर

  1. unzip और एक्सटेंशन को .0 से .cer में बदलें
  2. इसे / etc / pki / ca-trust / source / anchors / पर कॉपी करें
  3. अपडेट-सीए-ट्रस्ट कमांड चलाएं।

लिंक:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856

उन्होंने कहा कि वह OS X पर है, vCenter 6. नहीं
jww

0

मैक ओएस एक्स में पहले से स्थापित nltk (I python3 (3.6.2) के लिए चरणों को स्थापित करना

sudo easy_install pip

छह के पिछले संस्करण को अनइंस्टॉल करने की उपेक्षा करने के लिए अनदेखा स्थापित विकल्प का उपयोग करें, अन्यथा, यह अनइंस्टॉल करते समय एक त्रुटि देता है और आगे मूवी नहीं करता है

sudo pip3 install -U nltk --ignore-installed six

पाइप और अजगर की स्थापना की जांच करें, '3' संस्करणों का उपयोग करें

which python python2 python3
which pip pip2 pip3

जांचें कि क्या एनएलटीके स्थापित है

python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']

उदाहरण पुस्तक को स्थापित करने से पहले एसएसएल प्रमाणपत्र स्थापित करें, अन्यथा हम उदाहरण स्थापित करते समय त्रुटि प्रमाणपत्र देंगे

/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book

पुस्तक उदाहरण के लिए nltk और nltk_ata की स्थापना सफलतापूर्वक पूर्ण हुई


0

मेरे लिए काम PyOpenSSLकरते हुए इंस्टॉल करना pip(पीईएम में कनवर्ट किए बिना):

pip install PyOpenSSL

0

यदि आपके पास एक प्रॉक्सी सक्षम है और पुनः प्रयास करें, तो मुझे यह समस्या फ़िडलर (एक HTTP डीबगिंग प्रॉक्सी) को बंद करके हल की गई थी।


0

अजगर 2.7 में फ़ाइल सी के अंत में विश्वसनीय रूट CA विवरण जोड़ना: \ Python27 \ lib \ साइट-संकुल \ certifi \ cacert.pem ने मदद की

उसके बाद मैंने चलाया (व्यवस्थापक अधिकारों का उपयोग करके) पाइप इंस्टॉल --trusted-host pypi.python.org --trusted-host pypi.org - trusted-host files.pythonhosted.org packageName

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