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

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

4voto

Es gibt Fälle, in denen Sie keine unsicheren Verbindungen verwenden können oder einen SSL-Kontext an die urllib-Anforderung weiterleiten können. Hier meine Lösung basierend auf https://stackoverflow.com/a/28052583/6709778

Falls Sie Ihr eigenes Zertifikat verwenden möchten

import ssl

def new_ssl_context_decorator(*args, **kwargs):
    kwargs['cafile'] = '/etc/ssl/certs/ca-certificates.crt'
    return ssl.create_default_context(*args, **kwargs)

ssl._create_default_https_context = ssl._create_unverified_context

oder Sie können die gemeinsame Datei von certifi verwenden

def new_ssl_context_decorator(*args, **kwargs):
    import certifi
    kwargs['cafile'] = certifi.where()
    return ssl.create_default_context(*args, **kwargs)

4voto

Brian McCall Punkte 1663

Python 2.7 auf Amazon EC2 mit centOS 7

Ich musste die Umgebungsvariable SSL_CERT_DIR setzen, um auf mein ca-bundle zu verweisen, das sich unter /etc/ssl/certs/ca-bundle.crt befand

4voto

Wie Sie, verwende ich Python 2.7 auf meinem alten iMac (OS X 10.6.8), auch ich hatte das Problem bei der Verwendung von urllib2.urlopen:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

Meine Programme liefen ohne Probleme mit SSL-Zertifikaten und plötzlich (nach dem Herunterladen von Programmen) stürzten sie mit diesem SSL-Fehler ab.

Das Problem lag an der verwendeten Python-Version:

  1. Kein Problem mit https://www.python.org/downloads und python-2.7.9-macosx10.6.pkg

  2. Problem mit der Version, die mit dem Homebrew-Tool installiert wurde: "brew install python", Version befindet sich in /usr/local/bin.

Ein Abschnitt mit dem Titel Zertifikatüberprüfung und OpenSSL [GEÄNDERT für Python 2.7.9], in /Applications/Python 2.7/ReadMe.rtf erklärt das Problem mit vielen Details.

Überprüfen Sie also, laden Sie herunter und setzen Sie die richtige Version von Python in Ihren PATH.

4voto

Tom O Punkte 2087

Lösung für M1 MacOS

  1. Um herauszufinden, welche Pfade zur Überprüfung von SSL-Zertifikaten verwendet werden, führen Sie diesen Python-Code aus:

    import ssl ssl.get_default_verify_paths()

Bei mir wurde Folgendes zurückgegeben:

DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/opt/local/libexec/openssl3/etc/openssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/opt/local/libexec/openssl3/etc/openssl/certs')

Diese Pfade waren nicht korrekt.

  1. Daraufhin habe ich OpenSSL neu installiert, um herauszufinden, wo es installiert wurde. Ich habe folgendes ausgeführt:

    brew uninstall --ignore-dependencies openssl && brew install openssl

Schauen Sie sich die Ausgabe des obigen Befehls an, dort werden die Pfade für cert.pem und den certs-Ordner (die in Schritt 3 verwendet werden) angezeigt.

  1. Um mein System auf die korrekten Pfade aufmerksam zu machen, habe ich dann die folgenden Umgebungsvariablen gesetzt:

    export SSL_CERT_FILE=/opt/homebrew/etc/openssl@3/cert.pem export SSL_CERT_DIR=/opt/homebrew/etc/openssl@3/certs

(Fügen Sie diese Zeilen Ihrer .profile-Datei hinzu, um die Variablen dauerhaft zu setzen)

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