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

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

12voto

veganaiZe Punkte 549
$ cd $HOME
$ wget --quiet https://curl.haxx.se/ca/cacert.pem
$ export SSL_CERT_FILE=$HOME/cacert.pem

Quelle: https://access.redhat.com/articles/2039753

11voto

Leo Punkte 2350

Lösung für Anaconda

Meine Konfiguration ist Anaconda Python 3.7 auf MacOS mit einem Proxy. Die Pfade sind unterschiedlich.

  • So erhalten Sie den korrekten Zertifikatspfad:

    import ssl ssl.get_default_verify_paths()

was auf meinem System produziert hat

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

Wenn Sie wissen, wo das Zertifikat platziert werden soll, dann kombinieren Sie das Zertifikat, das vom Proxy verwendet wird, mit dem Ende dieser Datei.

Ich hatte bereits conda so eingerichtet, dass es mit meinem Proxy funktioniert, indem ich ausgeführt habe:

conda config --set ssl_verify .crt

Wenn Sie sich nicht daran erinnern, wo Ihr Zertifikat ist, können Sie es in ~/.condarc finden:

ssl_verify: .crt

Jetzt kombinieren Sie diese Datei mit dem Ende von /miniconda3/ssl/cert.pem und Anfragen sollten funktionieren, insbesondere sklearn.datasets und ähnliche Tools sollten funktionieren.

Weitere Einschränkungen

Die anderen Lösungen haben nicht funktioniert, weil die Anaconda-Konfiguration etwas anders ist:

  • Der Pfad Applications/Python\ 3.X existiert einfach nicht.

  • Der Pfad, der von den folgenden Befehlen bereitgestellt wird, ist der FALSCH Pfad

    from requests.utils import DEFAULT_CA_BUNDLE_PATH DEFAULT_CA_BUNDLE_PATH

9voto

corwin.amber Punkte 315

Ich muss eine weitere Antwort hinzufügen, weil ich genauso wie Craig Glennie wegen der vielen Beiträge zu diesem Problem im Web auf eine wilde Gänsejagd gegangen bin.

Ich benutze MacPorts, und was ich ursprünglich für ein Python-Problem hielt, stellte sich tatsächlich als ein MacPorts-Problem heraus: Es installiert kein Stammzertifikat mit seiner Installation von openssl. Die Lösung besteht darin, port install curl-ca-bundle zu verwenden, wie in diesem Blog-Beitrag erwähnt.

7voto

berniey Punkte 2592

Ich bin überrascht, dass all diese Anweisungen mein Problem nicht gelöst haben. Trotzdem ist die Diagnose korrekt (übrigens, ich benutze Mac und Python3.6.1). Also, um den richtigen Teil zusammenzufassen :

  • Auf dem Mac lässt Apple OpenSSL fallen
  • Python verwendet jetzt sein eigenes Set von CA-Root-Zertifikaten
  • Die binäre Python-Installation stellt ein Skript zur Verfügung, um die CA-Root-Zertifikate zu installieren, die Python benötigt ("/Applications/Python 3.6/Install Certificates.command")
  • Lesen Sie "/Applications/Python 3.6/ReadMe.rtf" für Details

Bei mir funktioniert das Skript nicht, und all diese Certifi- und OpenSSL-Installationen haben auch nicht geholfen. Vielleicht liegt es daran, dass ich mehrere Python-2- und 3-Installationen sowie viele Virtualenvs habe. Am Ende musste ich es manuell beheben.

pip install certifi   # für Ihr Virtualenv
mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl
cp -a /site-package/certifi/cacert.pem \
  /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

Wenn das immer noch fehlschlägt, dann installieren Sie auch (neu) OpenSSL.

port install openssl

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