473 Stimmen

Urllib und "SSL: CERTIFICATE_VERIFY_FAILED" Fehler

Ich erhalte folgenden Fehler:

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

Dies ist der Code, der diesen Fehler verursacht:

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)

Die von mir verwendete API erfordert die Verwendung von HTTPS. Wie kann ich sie verifizieren?


Für diese Fehlermeldung <strong>bei der Verwendung von Pip</strong>, siehe <a href="https://stackoverflow.com/questions/25981703">pip install fails with "connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)"</a> .

53voto

Claude COULOMBE Punkte 2958

Meine Lösung für Mac OS X:

  1. Upgrade auf Python 3.6.5 mit dem nativen App Python Installer, der von der offiziellen Python-Website heruntergeladen wurde https://www.python.org/downloads/

Ich habe festgestellt, dass dieser Installer die Aktualisierung der Links und Symlinks für das neue Python viel besser übernimmt als Homebrew.

  1. Installieren Sie ein neues Zertifikat mit "./Install Certificates.command", das sich im aktualisierten Python 3.6-Verzeichnis befindet

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

42voto

Chris Halcrow Punkte 25120

Sie könnten versuchen, dies zu Ihren Umgebungsvariablen hinzuzufügen:

PYTHONHTTPSVERIFY=0 

Beachten Sie, dass dies alle HTTPS-Verifizierungen deaktiviert, daher ist es ein etwas grobes Vorgehen. Wenn die Verifizierung jedoch nicht erforderlich ist, kann dies eine effektive Lösung sein.

36voto

ritiek Punkte 2047

Ich hatte ein ähnliches Problem auf einer meiner Linux-Maschinen. Das Generieren neuer Zertifikate und das Exportieren einer Umgebungsvariable, die auf das Zertifikatsverzeichnis zeigt, haben das Problem für mich behoben:

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

23voto

Ali ZahediGol Punkte 696

Ich denke, Sie haben mehrere Möglichkeiten, dieses Problem zu beheben. Ich habe unten 5 Möglichkeiten erwähnt:

  1. Sie können für jeden Request einen Kontext definieren und den Kontext bei jedem Request übergeben, um ihn wie folgt zu verwenden:

    import certifi import ssl import urllib context = ssl.create_default_context(cafile=certifi.where()) result = urllib.request.urlopen('https://www.example.com', context=context)

  2. ODER Zertifikatsdatei in Umgebung setzen.

    import os import certifi import urllib os.environ["REQUESTS_CA_BUNDLE"] = certifi.where() os.environ["SSL_CERT_FILE"] = certifi.where() result = urllib.request.urlopen('https://www.example.com')

  3. ODER die Methode create default https context ersetzen:

    import certifi import ssl ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where()) result = urllib.request.urlopen('https://www.example.com')

  4. ODER Wenn Sie eine Linux-Maschine verwenden, können Sie das Problem durch Generieren neuer Zertifikate und Exportieren einer Umgebungsvariable, die auf das Zertifikatverzeichnis zeigt, beheben.

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

  5. ODER Wenn Sie eine Mac-Maschine verwenden, können Sie das Problem durch Generieren neuer Zertifikate beheben

    $ cd "/Applications/$(python3 --version | awk '{print $2}'| awk -F. '{print "Python " $1"."$2}')" $ sudo "./Install Certificates.command"

16voto

Steffen Ullrich Punkte 110770

Wie ich bereits in einem Kommentar geschrieben habe, ist dieses Problem wahrscheinlich mit dieser SO-Antwort verbunden.

Kurz gesagt: Es gibt mehrere Möglichkeiten, das Zertifikat zu überprüfen. Die Überprüfung, die von OpenSSL verwendet wird, ist mit den vertrauenswürdigen Stammzertifikaten auf Ihrem System nicht kompatibel. OpenSSL wird von Python verwendet.

Sie könnten versuchen, das fehlende Zertifikat für Verisign Class 3 Public Primary Certification Authority zu erhalten und dann die cafile-Option gemäß der Python-Dokumentation zu verwenden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X