urllib und „SSL: CERTIFICATE_VERIFY_FAILED“-Fehler

Lesezeit: 9 Minuten

Benutzeravatar von user3724476
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)>

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 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

    – 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

Benutzeravatar von Noelkd
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:

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)

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:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

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:

  1. Laden Sie das Domain-Validierungszertifikat als *.crt- oder *pem-Datei herunter
  2. Öffnen Sie die Datei im Editor und kopieren Sie den Inhalt in die Zwischenablage
  3. finde deinen cacert.pem Lage: from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. bearbeiten die cacert.pem Datei und fügen Sie Ihr Domain-Validierungszertifikat am Ende der Datei ein.
  5. 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!

    – ofavre

    23. März 2017 um 12:01 Uhr

  • Leider verwenden Python-Anforderungen keinen CA-Vertrauensspeicher eines Betriebssystems. github.com/requests/requests/issues/2966. Sie müssen REQUESTS_CA_BUNDLE setzen github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514.

    – Jamshid

    22. Juli 2018 um 5:49 Uhr

  • 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

Benutzeravatar von Saim Ehsan
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:

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()))

  • 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!

    – ofavre

    23. März 2017 um 12:01 Uhr

  • Leider verwenden Python-Anforderungen keinen CA-Vertrauensspeicher eines Betriebssystems. github.com/requests/requests/issues/2966. Sie müssen REQUESTS_CA_BUNDLE setzen github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514.

    – Jamshid

    22. Juli 2018 um 5:49 Uhr

  • 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

Benutzeravatar von Claude COULOMBE
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


1399400cookie-checkurllib und „SSL: CERTIFICATE_VERIFY_FAILED“-Fehler

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy