urllib und „SSL: CERTIFICATE_VERIFY_FAILED“-Fehler
Lesezeit: 9 Minuten
Benutzer3724476
Ich erhalte den 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", 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)>
Die von mir verwendete API erfordert die Verwendung von HTTPS. Wie kann ich die Überprüfung umgehen?
An der URL ist nichts auszusetzen und sie kann mit den gängigen vertrauenswürdigen Zertifikaten erfolgreich verifiziert werden. Sie sollten also besser nicht versuchen, die Zertifikatsvalidierung zu umgehen, sondern sie zu beheben. Welche Python-Version verwendest du?
– Steffen Ullrich
8. Januar 2015 um 8:27 Uhr
Dies könnte mit stackoverflow.com/a/27826829/3081018 zusammenhängen. Der Server verwendet die gleiche Art von Zertifikatskette mit mehreren Vertrauenspfaden. Sehen Sie dort, welches Cafile Sie möglicherweise zur Verifizierung verwenden müssen.
– Steffen Ullrich
8. Januar 2015 um 8:31 Uhr
Dieser Fehler tritt auch bei Python 3.5 nach dem Upgrade auf Yosemite auf
“Wie kann ich die Überprüfung umgehen?” ist die falsche Frage. Sie sollten wahrscheinlich fragen, wie Sie das von der Domäne bereitgestellte Zertifikat validieren können.
– jww
8. Juni 2017 um 5:24 Uhr
Noelkd
Wenn du nur Überprüfung umgehen möchten, können Sie eine neue erstellen SSLContext. Standardmäßig werden neu erstellte Kontexte verwendet CERT_NONE.
Seien Sie dabei vorsichtig, wie in Abschnitt angegeben 17.3.7.2.1
Beim direkten Aufruf des SSLContext-Konstruktors ist CERT_NONE der Standardwert. Da es den anderen Peer nicht authentifiziert, kann es unsicher sein, insbesondere im Client-Modus, wo Sie meistens die Authentizität des Servers sicherstellen möchten, mit dem Sie sprechen. Daher wird im Clientmodus dringend empfohlen, CERT_REQUIRED zu verwenden.
Aber wenn Sie nur wollen, dass es jetzt aus einem anderen Grund funktioniert, können Sie Folgendes tun, müssen Sie import ssl auch:
Dies sollte Ihr Problem umgehen, aber Sie lösen keines der Probleme wirklich, aber Sie werden das nicht sehen [SSL: CERTIFICATE_VERIFY_FAILED] weil Sie das Zertifikat jetzt nicht verifizieren!
Um das oben Genannte zu ergänzen, wenn Sie mehr darüber erfahren möchten, warum Sie diese Probleme sehen, sollten Sie einen Blick darauf werfen PEP 476.
Dieser PEP schlägt vor, die Überprüfung von X509-Zertifikatssignaturen sowie die Hostnamen-Überprüfung für HTTP-Clients von Python standardmäßig zu aktivieren, vorbehaltlich einer Opt-out-Basis pro Anruf. Diese Änderung würde auf Python 2.7, Python 3.4 und Python 3.5 angewendet.
Es gibt ein empfohlenes Opt-out, das meinem obigen Ratschlag nicht unähnlich ist:
import ssl
# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)
Es verfügt auch über eine sehr entmutigt Möglichkeit über Affenpatchen was Sie in Python nicht oft sehen:
Dadurch wird die Standardfunktion für die Kontexterstellung mit der Funktion zum Erstellen eines unverifizierten Kontexts überschrieben.
Bitte beachten Sie dabei wie im PEP angegeben:
Diese Anleitung richtet sich in erster Linie an Systemadministratoren, die neuere Versionen von Python übernehmen möchten, die diesen PEP in Legacy-Umgebungen implementieren, die die Zertifikatsüberprüfung bei HTTPS-Verbindungen noch nicht unterstützen. Ein Administrator kann sich beispielsweise abmelden, indem er den obigen Affenpatch zu sitecustomize.py in seiner Standardbetriebsumgebung für Python hinzufügt. Anwendungen und Bibliotheken SOLLTEN diesen Änderungsprozess NICHT weitreichend machen (außer vielleicht als Reaktion auf eine vom Systemadministrator kontrollierte Konfigurationseinstellung).
Wenn Sie ein Papier darüber lesen möchten, warum die Nichtvalidierung von Zertifikaten in Software schlecht ist Sie können es hier finden!
Also, wenn dieser Fehler mich von der Verwendung abhält setup.py upload wie kann ich das beheben?
– pyCthon
3. März 2015 um 22:36 Uhr
ssl._create_default_https_context = ssl._create_unverified_context dies hat für mich funktioniert, wie von Noelkd gegen Ende erwähnt. Da es sich bei uns um eine Intranet-Site für HP-Drucker handelt … die nur zum Schaben verwendet werden … haben wir kein Problem mit dieser Methode.
– ihightower
26. März 2015 um 9:59 Uhr
Ihre erste Methode ist die am wenigsten wünschenswerte – Bypass-Validierung. Warum wird derjenige, der das Zertifikat tatsächlich validiert, nicht zuerst aufgeführt?
– jww
8. Juni 2017 um 5:23 Uhr
Dies kann auch passieren, wenn Sie eine veraltete Version von openSSL haben. Was bei mir funktioniert hat, war das Aktualisieren auf die neueste Version von certifi und Updates von openssl auf den Boxen.
– Mahdi Yusuf
27. Juni 2017 um 16:26 Uhr
context ist, was ich brauchte
– Prayagupa
15. November 2017 um 0:40 Uhr
Versuchen sudo /Applications/Python\ 3.6/Install\ Certificates.command wenn Berechtigungen verweigert werden.
– KingKongCoder
30. Oktober 2018 um 22:38 Uhr
Dies behebt das Problem in Python 3.6 nicht. -1
– PS
2. Dezember 2018 um 12:43 Uhr
Wenn Sie die Verwendung der Befehlszeile ausflippt (wahrscheinlich nicht, wenn Sie hier sind, aber hey), können Sie auch den Anwendungsordner (oder einen entsprechenden Ordner auf anderen Betriebssystemen) finden, den Python bei der Installation erstellt hat, und dann das Skript durch Doppelklicken öffnen. Der genaue Name des Ordners hängt von der Version von Python ab, die Sie installiert haben.
– Erdős-Bacon
6. Dezember 2018 um 18:23 Uhr
Funktionierte wie ein Zauber für Python 3.7.3. Vielen Dank.
– kbytec
10. April 2019 um 0:40 Uhr
Vielen Dank. Ich habe buchstäblich nach Hunderten von Lösungen gesucht und Ihre hat funktioniert.
– Nischay Namdev
13. Mai 2020 um 16:44 Uhr
Unter Windows schaut sich Python das Systemzertifikat nicht an, es verwendet sein eigenes unter ?\lib\site-packages\certifi\cacert.pem.
Die Lösung deines Problems:
Laden Sie das Domain-Validierungszertifikat als *.crt- oder *pem-Datei herunter
Öffnen Sie die Datei im Editor und kopieren Sie den Inhalt in die Zwischenablage
finde deinen cacert.pem Lage: from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
bearbeiten die cacert.pem Datei und fügen Sie Ihr Domain-Validierungszertifikat am Ende der Datei ein.
Speichern Sie die Datei und freuen Sie sich über Anfragen!
lib\site-packages\certifi\cacert.pem existiert in Python 2.7.10 nicht. Und die Frage dreht sich um urllib2 nicht requests
– Kevin Smyth
15. Januar 2016 um 21:38 Uhr
Bisher die beste Lösung, die Twitter-API verwendet das DigiCert-Zertifikat, das nicht in der cacert.pem-Datei meiner Python enthalten ist. Ich habe dort hinzugefügt und VOILA!
– digz6666
23. Februar 2016 um 4:07 Uhr
Auf Debian gearbeitet. Für die Aufzeichnungen lautete der Dateipfad auf meinem System: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Vielen Dank!
Funktioniert unter Windows 10, Python 3.6, mit den Google- und Twitter-APIs und dem Anforderungsmodul im Allgemeinen.
– tblznbits
20. November 2018 um 14:18 Uhr
Saim Essan
Ich hatte ein ähnliches Problem, obwohl ich benutzte urllib.request.urlopen in Python 3.4, 3.5 und 3.6. (Dies ist ein Teil des Python 3-Äquivalents von urllib2gemäß der Anmerkung am Kopf von Python 2 urllib2 Dokumentationsseite.)
Meine Lösung war pip install certifi installieren certifidas hat:
… eine sorgfältig kuratierte Sammlung von Root-Zertifikaten zur Validierung der Vertrauenswürdigkeit von SSL-Zertifikaten bei gleichzeitiger Überprüfung der Identität von TLS-Hosts.
Dann, in meinem Code, wo ich vorher gerade hatte:
import urllib.request as urlrq
resp = urlrq.urlopen('https://example.com/bar/baz.html')
Ich habe es überarbeitet zu:
import urllib.request as urlrq
import certifi
resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())
Wenn ich die lese urllib2.urlopen Dokumentation richtig, es hat auch eine cafile Streit. So, urllib2.urlopen([...], certifi.where()) könnte auch für Python 2.7 funktionieren.
UPDATE (01.01.2020): Ab Python 3.6, das cafile Argument zu urlopen ist veraltetmit dem context Argument soll stattdessen angegeben werden. Ich fand Folgendes auf 3.5 bis 3.8 gleich gut:
lib\site-packages\certifi\cacert.pem existiert in Python 2.7.10 nicht. Und die Frage dreht sich um urllib2 nicht requests
– Kevin Smyth
15. Januar 2016 um 21:38 Uhr
Bisher die beste Lösung, die Twitter-API verwendet das DigiCert-Zertifikat, das nicht in der cacert.pem-Datei meiner Python enthalten ist. Ich habe dort hinzugefügt und VOILA!
– digz6666
23. Februar 2016 um 4:07 Uhr
Auf Debian gearbeitet. Für die Aufzeichnungen lautete der Dateipfad auf meinem System: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Vielen Dank!
Funktioniert unter Windows 10, Python 3.6, mit den Google- und Twitter-APIs und dem Anforderungsmodul im Allgemeinen.
– tblznbits
20. November 2018 um 14:18 Uhr
Claude COULOMBE
Meine Lösung für Mac OS X:
1) Führen Sie ein Upgrade auf Python 3.6.5 durch, indem Sie das native Python-Installationsprogramm der App verwenden, das Sie von der offiziellen Website der Python-Sprache heruntergeladen haben https://www.python.org/downloads/
Ich habe festgestellt, dass dieses Installationsprogramm die Links und Symlinks für das neue Python viel besser aktualisiert als Homebrew.
2) 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"
Funktionierte wie ein Zauber in Mac OS X.
– Manu Mathew
7. Mai 2019 um 9:38 Uhr
Mit den Worten eines alten Kollegen … “Sie sind ein Champion-Mann”
– Kunal
13. August 2020 um 17:51 Uhr
Mehrere andere Lösungen ausprobiert: Dies funktionierte unter 10.14 Mojave
– mircealungu
15. Oktober 2020 um 11:25 Uhr
13994000cookie-checkurllib und „SSL: CERTIFICATE_VERIFY_FAILED“-Fehleryes
An der URL ist nichts auszusetzen und sie kann mit den gängigen vertrauenswürdigen Zertifikaten erfolgreich verifiziert werden. Sie sollten also besser nicht versuchen, die Zertifikatsvalidierung zu umgehen, sondern sie zu beheben. Welche Python-Version verwendest du?
– Steffen Ullrich
8. Januar 2015 um 8:27 Uhr
Dies könnte mit stackoverflow.com/a/27826829/3081018 zusammenhängen. Der Server verwendet die gleiche Art von Zertifikatskette mit mehreren Vertrauenspfaden. Sehen Sie dort, welches Cafile Sie möglicherweise zur Verifizierung verwenden müssen.
– Steffen Ullrich
8. Januar 2015 um 8:31 Uhr
Dieser Fehler tritt auch bei Python 3.5 nach dem Upgrade auf Yosemite auf
– pyCthon
3. März 2015 um 22:43 Uhr
Dies erklärt die Situation. access.redhat.com/articles/2039753
– Charlie Burns
10. Januar 2017 um 0:15 Uhr
“Wie kann ich die Überprüfung umgehen?” ist die falsche Frage. Sie sollten wahrscheinlich fragen, wie Sie das von der Domäne bereitgestellte Zertifikat validieren können.
– jww
8. Juni 2017 um 5:24 Uhr