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

7voto

Ich habe das hier gefunden hier

Ich habe diese Lösung gefunden, fügen Sie diesen Code am Anfang Ihrer Quelldatei ein:

import ssl

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Dieser Code hebt die Verifizierung auf, sodass das SSL-Zertifikat nicht überprüft wird.

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

7voto

Danielle Cohen Punkte 549

Schau dir das an

/Anwendungen/Python 3.6/Install Zertifikate.command

Du kannst auch zum Anwendungen Ordner im Finder gehen und auf Zertifikate.command klicken

7voto

WebDev Punkte 1321

Der SSL: CERTIFICATE_VERIFY_FAILED-Fehler kann auch auftreten, wenn ein Zwischenzertifikat im ca-certificates-Paket auf Linux fehlt. Zum Beispiel fehlte in meinem Fall das Zwischenzertifikat "DigiCert SHA2 Secure Server CA" im ca-certificates-Paket, obwohl es im Firefox-Browser enthalten ist. Sie können herausfinden, welches Zertifikat fehlt, indem Sie den wget-Befehl direkt auf die URL ausführen, die diesen Fehler verursacht. Dann können Sie nach dem entsprechenden Link zur CRT-Datei für dieses Zertifikat von der offiziellen Website (z.B. https://www.digicert.com/digicert-root-certificates.htm in meinem Fall) der Zertifizierungsstelle suchen. Nun, um das fehlende Zertifikat in Ihrem Fall einzuschließen, können Sie die folgenden Befehle ausführen, indem Sie Ihren CRT-Dateidownload-Link verwenden:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

Nach diesem Schritt können Sie erneut mit wget für Ihre URL testen sowie das Python-urllib-Paket verwenden. Für weitere Details siehe: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

5voto

Cherif KAOUA Punkte 816

Für Python 3.4+ auf Centos 6/7, Fedora installieren Sie einfach das vertrauenswürdige CA auf diese Weise :

  1. Kopieren Sie die CA.crt nach /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract

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