Ich erhalte die folgende Fehlermeldung:
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)
Für die von mir verwendete API muss ich HTTPS verwenden. Wie kann ich die Überprüfung umgehen?
python
python-2.7
ssl
ssl-certificate
urllib
user3724476
quelle
quelle
Antworten:
Wenn Sie nur die Überprüfung umgehen möchten, können Sie einen neuen SSLContext erstellen . Standardmäßig verwenden neu erstellte Kontexte CERT_NONE .
Seien Sie vorsichtig damit, wie in Abschnitt 17.3.7.2.1 angegeben
Aber wenn Sie nur möchten, dass es jetzt aus einem anderen Grund funktioniert, können Sie Folgendes tun:
import ssl
auch:Dies sollte Ihr Problem
[SSL: CERTIFICATE_VERIFY_FAILED]
umgehen , aber Sie lösen keines der Probleme wirklich, aber Sie werden das nicht sehen, weil Sie das Zertifikat jetzt nicht verifizieren!Wenn Sie mehr darüber erfahren möchten, warum diese Probleme auftreten, sollten Sie einen Blick darauf werfen PEP 476 .
Es gibt ein empfohlenes Opt-out, das meinem obigen Rat nicht unähnlich ist:
Es bietet auch eine sehr entmutigte Option über Monkeypatching, die Sie in Python nicht oft sehen:
Dadurch wird die Standardfunktion für die Kontexterstellung mit der Funktion zum Erstellen eines nicht verifizierten Kontexts überschrieben.
Bitte beachten Sie dazu, wie im PEP angegeben:
Wenn Sie einen Artikel darüber lesen möchten, warum das Nicht-Validieren von Zertifikaten in Software schlecht ist, finden Sie ihn hier !
quelle
setup.py upload
wie kann ich das beheben?certifi
und das Aktualisieren von openssl auf den Boxen.context
ist das, was ich brauchteDies ist keine Lösung für Ihr spezifisches Problem, aber ich stelle es hier vor, da dieser Thread das beste Google-Ergebnis für "SSL: CERTIFICATE_VERIFY_FAILED" ist und mich auf eine wilde Gänsejagd führt.
Wenn Sie Python 3.6 unter OSX installiert haben und beim Versuch, eine Verbindung zu einer https: // Site herzustellen, der Fehler "SSL: CERTIFICATE_VERIFY_FAILED" angezeigt wird, liegt dies wahrscheinlich daran, dass Python 3.6 unter OSX überhaupt keine Zertifikate hat und kein SSL validieren kann Verbindungen. Dies ist eine Änderung für 3.6 unter OSX und erfordert einen Schritt nach der Installation, in dem das installiert wird
certifi
Zertifikatspaket . Dies ist in der ReadMe dokumentiert, die Sie unter finden sollten/Applications/Python\ 3.6/ReadMe.rtf
In ReadMe können Sie dieses Skript nach der Installation ausführen, das gerade installiert wird
certifi
:/Applications/Python\ 3.6/Install\ Certificates.command
In den Versionshinweisen finden Sie weitere Informationen: https://www.python.org/downloads/release/python-360/
quelle
/Applications/Python\ 3.7/Install\ Certificates.command
dies direkt ausgeführt habeterminal
! Vielen Dank an @CraigGlennie & @muyong. Ich freue mich,out-of-the-box-thinking
dass Sie dies hier platziert haben!Um die Antwort von Craig Glennie zu erweitern:
in Python 3.6.1 unter MacOs Sierra
Die Eingabe im Bash-Terminal löste das Problem:
quelle
sudo /Applications/Python\ 3.6/Install\ Certificates.command
wenn Berechtigungen verweigert werden.Unter Windows überprüft Python das Systemzertifikat nicht, sondern verwendet sein eigenes unter
?\lib\site-packages\certifi\cacert.pem
.Die Lösung für Ihr Problem:
cacert.pem
Standort:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
cacert.pem
Datei und fügen Sie Ihr Domain-Validierungszertifikat am Ende der Datei ein.quelle
lib\site-packages\certifi\cacert.pem
existiert nicht in Python 2.7.10. Und die Frage ist überurllib2
nichtrequests
/usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem
. Vielen Dank!Meine Lösung für Mac OS X:
1) Aktualisieren Sie auf Python 3.6.5 mit dem Python-Installationsprogramm für native Apps, das von der offiziellen Python-Sprachwebsite https://www.python.org/downloads/ heruntergeladen wurde.
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
quelle
Sie können versuchen, dies zu Ihren Umgebungsvariablen hinzuzufügen:
Beachten Sie, dass dadurch alle HTTP-Überprüfungen deaktiviert werden. Dies ist also ein Vorschlaghammer-Ansatz. Wenn jedoch keine Überprüfung erforderlich ist, ist dies möglicherweise eine effektive Lösung.
quelle
Ich hatte ein ähnliches Problem, obwohl ich es
urllib.request.urlopen
in Python 3.4, 3.5 und 3.6 verwendet habe . (Dies ist ein Teil des Python 3-Äquivalentsurllib2
gemäß dem Hinweis am Anfang derurllib2
Dokumentationsseite von Python 2. )Meine Lösung war
pip install certifi
zu installierencertifi
, die hat:Dann in meinem Code, wo ich vorher gerade hatte:
Ich habe es überarbeitet zu:
Wenn ich die
urllib2.urlopen
Dokumentation richtig gelesen habe , hat sie auch eincafile
Argument. Funktionierturllib2.urlopen([...], certifi.where())
möglicherweise auch für Python 2.7.UPDATE (2020-01-01): Ab Python 3.6 ist das
cafile
Argument tourlopen
veraltet ,context
stattdessen sollte das Argument angegeben werden. Ich fand, dass Folgendes bei 3.5 bis 3.8 gleich gut funktioniert:quelle
load_verify_locations
mutiert dieSSLContext
Instanz und gibt zurückNone
. Sie solltencontext=ssl.create_default_context(cafile=certifi.where())
stattdessen verwenden. Weitere Informationen finden Sie in denssl
Dokumenten .ssl
Funktion verwendet haben. Siehe Bearbeiten; okay?Entnommen von hier https://gist.github.com/michaelrice/a6794a017e349fc65d01
quelle
Wie ich in einem Kommentar geschrieben habe, hängt dieses Problem wahrscheinlich mit dieser SO-Antwort zusammen .
Kurz gesagt: Es gibt mehrere Möglichkeiten, das Zertifikat zu überprüfen. Die von OpenSSL verwendete Überprüfung ist nicht mit den vertrauenswürdigen Stammzertifikaten kompatibel, die Sie auf Ihrem System haben. OpenSSL wird von Python verwendet.
Sie können versuchen, das fehlende Zertifikat für die öffentliche primäre Zertifizierungsstelle der Verisign-Klasse 3 abzurufen und dann die
cafile
Option gemäß der Python-Dokumentation verwenden :quelle
Ich hatte ein ähnliches Problem auf einem meiner Linux-Computer. Das Generieren neuer Zertifikate und das Exportieren einer Umgebungsvariablen, die auf das Zertifikatsverzeichnis verweist, hat dies für mich behoben:
quelle
Ich muss eine weitere Antwort hinzufügen, da ich genau wie Craig Glennie aufgrund der vielen Beiträge, die sich auf dieses Problem im Internet beziehen, einer wilden Gänsejagd nachgegangen bin.
Ich verwende MacPorts, und was ich ursprünglich für ein Python-Problem hielt, war tatsächlich ein MacPorts-Problem: Es installiert kein Stammzertifikat mit der Installation von openssl. Die Lösung ist
port install curl-ca-bundle
, wie in diesem Blog-Beitrag erwähnt .quelle
Ich habe das hier gefunden
Ich habe diese Lösung gefunden. Fügen Sie diesen Code am Anfang Ihrer Quelldatei ein:
Dieser Code macht die Überprüfung rückgängig, sodass die SSL-Zertifizierung nicht überprüft wird.
quelle
Installieren Sie für Python 3.4+ unter Centos 6/7, Fedora , die vertrauenswürdige Zertifizierungsstelle folgendermaßen :
/etc/pki/ca-trust/source/anchors/
update-ca-trust force-enable
update-ca-trust extract
quelle
Lösung für Anaconda
Mein Setup ist Anaconda Python 3.7 unter MacOS mit einem Proxy. Die Wege sind unterschiedlich.
was auf meinem System produziert
Sobald Sie wissen, wohin das Zertifikat geht, verketten Sie das vom Proxy verwendete Zertifikat mit dem Ende dieser Datei.
Ich hatte conda bereits für die Arbeit mit meinem Proxy eingerichtet, indem ich Folgendes ausgeführt habe:
Wenn Sie sich nicht erinnern, wo sich Ihr Zertifikat befindet, finden Sie es in
~/.condarc
:Nun verketten die Datei zu Ende
/miniconda3/ssl/cert.pem
und Anfragen sollten arbeiten, insbesondere ,sklearn.datasets
und ähnliche Werkzeuge funktionieren soll.Weitere Vorsichtsmaßnahmen
Die anderen Lösungen haben nicht funktioniert, da das Anaconda-Setup etwas anders ist:
Der Pfad existiert
Applications/Python\ 3.X
einfach nicht.Der von den folgenden Befehlen bereitgestellte Pfad ist der falsche Pfad
quelle
Ich hänge meinen Kopf halb beschämt, da ich das gleiche Problem hatte, außer dass in meinem Fall die URL, auf die ich traf, gültig war und das Zertifikat gültig war. Was nicht gültig war, war meine Verbindung zum Internet. Ich konnte dem Browser keine Proxy-Details hinzufügen (in diesem Fall IE). Dies verhinderte, dass der Überprüfungsprozess korrekt ablief.
In den Proxy-Details hinzugefügt und meine Python war dann sehr glücklich.
quelle
Python 2.7.12 (Standard, 29. Juli 2016, 15:26:22) hat das erwähnte Problem behoben. Diese Informationen könnten jemand anderem helfen.
quelle
certifi
, die anscheinend nur einen Teil der Zertifikate von enthältrequests
, hat das Problem für mich in Python 3.4 bis 3.6 behoben .Ich bin überrascht, dass all diese Anweisungen mein Problem nicht gelöst haben. Trotzdem ist die Diagnose korrekt (übrigens verwende ich Mac und Python3.6.1). Um den richtigen Teil zusammenzufassen:
Für mich funktioniert das Skript nicht und all diese Zertifizierungs- und OpenSL-Installationen konnten ebenfalls nicht behoben werden. Vielleicht, weil ich mehrere Python 2- und 3-Installationen sowie viele virtuelle Umgebungen habe. Am Ende muss ich es von Hand reparieren.
Wenn das immer noch fehlschlägt. Installieren Sie dann auch OpenSSL neu.
quelle
Wie Sie verwende ich Python 2.7 auf meinem alten iMac (OS X 10.6.8). Ich habe das Problem auch mit urllib2.urlopen gelöst:
Meine Programme liefen ohne Probleme mit SSL-Zertifikaten einwandfrei und stürzten plötzlich (nach dem Herunterladen von Programmen) mit diesem SSL-Fehler ab.
Das Problem war die verwendete Python-Version:
Kein Problem mit https://www.python.org/downloads und python-2.7.9-macosx10.6.pkg
Problem mit dem vom Homebrew-Tool installierten: " Brew Install Python", Version in / usr / local / bin.
Ein Kapitel mit dem Titel
Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
in/Applications/Python 2.7/ReadMe.rtf
erklärt das Problem mit vielen Details.Überprüfen Sie also die richtige Python-Version, laden Sie sie herunter und geben Sie sie in Ihren PATH ein.
quelle
Python 2.7 auf Amazon EC2 mit centOS 7
Ich musste die env-Variable so einstellen
SSL_CERT_DIR
, dass sie auf meine zeigt,ca-bundle
die sich bei befindet/etc/ssl/certs/ca-bundle.crt
quelle
SSL_CERT_DIR
zu/etc/ssl/certs
und sorgte auch dafür , dasca-certificates
war Paket installiert und auf dem neuesten Stand.Quelle: https://access.redhat.com/articles/2039753
quelle
Versuchen
Es hat bei mir funktioniert.
quelle
Schau es dir an
/ Applications / Python 3.6 / Install Certificates.command
Sie können auch zu Aplications gehen und auf Certificates.command klicken
quelle
In meinem Fall wurde dieser Fehler angezeigt, weil
requests
undurllib3
Versionen nicht kompatibel waren und bei der Installation der folgende Fehler auftrat:hat den Trick gemacht.
quelle
Eine weitere Anaconda-Lösung. Ich habe CERTIFICATE_VERIFY_FAILED in meiner Python 2.7-Umgebung unter macOS erhalten. Es stellte sich heraus, dass die Kondapfade schlecht waren:
Basisumgebung (3.7):
2.7 Umgebung (Pfade existierten nicht!):
Die Reparatur:
quelle
Der Fehler SSL: CERTIFICATE_VERIFY_FAILED kann auch auftreten, weil im
ca-certificates
Paket unter Linux ein Zwischenzertifikat fehlt . In meinem Fall fehlte beispielsweise das Zwischenzertifikat " DigiCert SHA2 Secure Server CA " imca-certificates
Paket, obwohl der Firefox-Browser es enthält. Sie können herausfinden, welches Zertifikat fehlt, indem Sie denwget
Befehl direkt auf der URL ausführen, die diesen Fehler verursacht. Dann können Sie auf der offiziellen Website (z. B. https://www.digicert.com/digicert-root-certificates.htm in meinem Fall) der Zertifizierungsstelle nach dem entsprechenden Link zur CRT-Datei für dieses Zertifikat suchen . Um das in Ihrem Fall fehlende Zertifikat einzuschließen, können Sie stattdessen die folgenden Befehle über den Download-Link für CRT-Dateien ausführen:Danach können Sie erneut mit
wget
Ihrer URL sowie mit dem Python-urllib
Paket testen . Weitere Informationen finden Sie unter: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242quelle
Wenn Sie sich in vCenter 6 befinden, sollten Sie stattdessen das VMware-Zertifizierungsstellenzertifikat Ihres VMenter zur Liste der vertrauenswürdigen Zertifizierungsstellen Ihres Betriebssystems hinzufügen. Gehen Sie wie folgt vor, um Ihr Zertifikat herunterzuladen
Auf Fedora
Links:
quelle
Installationsschritte für nltk (ich hatte Python3 (3.6.2) bereits in MAC OS X installiert
Verwenden Sie die Option "Installierte ignorieren", um die Deinstallation der vorherigen Version von 6 zu ignorieren. Andernfalls wird beim Deinstallieren ein Fehler ausgegeben und der Film wird nicht weitergeleitet
Überprüfen Sie die Installation von Pip und Python und verwenden Sie die '3'-Versionen
Überprüfen Sie, ob NLTK installiert ist
Installieren Sie das SSL-Zertifikat, bevor Sie das Beispielbuch installieren. Andernfalls wird bei der Installation der Beispiele ein Zertifikatfehler angezeigt
Damit wurde die Installation von nltk und nltk_ata für Buchbeispiele erfolgreich abgeschlossen
quelle
Die Installation
PyOpenSSL
mitpip
hat bei mir funktioniert (ohne auf PEM zu konvertieren):quelle
Ich hatte dieses Problem gelöst, indem ich Fiddler (einen HTTP-Debugging-Proxy) geschlossen habe. Überprüfen Sie, ob ein Proxy aktiviert ist, und versuchen Sie es erneut.
quelle
In Python 2.7 hat das Hinzufügen von Details zur vertrauenswürdigen Stammzertifizierungsstelle am Ende in Datei C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem geholfen
Danach habe ich (mit Administratorrechten) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName ausgeführt
quelle