Fehlermeldung
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
Auch ausgegeben als
- urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
Der Text in den Klammern ist der zugrunde liegende ssl-Fehler und variiert („self-signed certificate in certificate chain“, „certificate has expired“, …). Python schließt ihn mit einer Quellcode-Position und „>“ ab, etwa „(_ssl.c:1082)>“.
Python urllib.request — urllib.error.URLError wrapping ssl.SSLCertVerificationError
Was der Fehler bedeutet
urllib.request.urlopen() verpackt jedes Verbindungsproblem in URLError, deshalb erscheint der TLS-Fehler innerhalb von „<urlopen error …>“. Passiert das bei jeder öffentlichen Website, auch bei www.python.org, hat der Python-Prozess überhaupt keine brauchbaren CA-Zertifikate: Der klassische Fall ist der python.org-Installer unter macOS, dessen mitgeliefertes OpenSSL den Schlüsselbund nicht liest, solange „Install Certificates.command“ nicht ausgeführt wurde.
Warum der Fehler auftritt
Python von python.org unter macOS ohne seine Zertifikate
häufigDer Installer liefert OpenSSL mit einem leeren Trust Store aus, dazu das Hilfsskript „Install Certificates.command“, das certifi installiert und verlinkt. Wird es übersprungen (oder später eine neue Minor-Version installiert), kann urlopen überhaupt nichts prüfen.
Ein minimales Image oder ein eigener Python-Build ohne CA-Bundle
gelegentlichEin aus dem Quellcode kompiliertes oder in ein scratch- oder Distroless-Image kopiertes Python sucht den Standardpfad des OpenSSL-Bundles, den es dort nicht gibt.
Ein Proxy mit TLS-Inspektion
gelegentlichScheitern nur manche Websites oder begannen die Fehler in einem Firmennetzwerk, ist die wahrscheinliche Ursache, dass dieses Python dem Root-Zertifikat eines Proxys nicht vertraut.
SSL_CERT_FILE oder SSL_CERT_DIR zeigt auf die falsche Stelle
seltenDiese Variablen ersetzen die Standardpfade für den gesamten Prozess; eine leere oder unpassende Datei lässt jede Prüfung scheitern.
So behebst du den Fehler
- 1.
macOS: Install Certificates.command ausführen
Führe es für jede Python-Version von python.org im Finder oder im Terminal aus und stelle danach sicher, dass der Standardpfad der CA-Datei existiert.
bash # macOS, python.org installer (one script per installed version) "/Applications/Python 3.14/Install Certificates.command" python3 -c "import ssl; print(ssl.get_default_verify_paths().openssl_cafile)" - 2.
Einen aus certifi erstellten Kontext übergeben
Baue für Skripte, die überall funktionieren müssen, den SSL-Kontext explizit aus certifi.where(); halte certifi aktuell, damit seine Root-Zertifikate auf dem neuesten Stand bleiben.
python # Explicit, portable: use certifi's Mozilla bundle for this request # pip install certifi import certifi, ssl, urllib.request ctx = ssl.create_default_context(cafile=certifi.where()) urllib.request.urlopen("https://www.python.org/", context=ctx) - 3.
Oder den Trust Store des Betriebssystems verwenden
truststore.inject_into_ssl() lässt urllib, http.client und auf ssl aufbauende Bibliotheken über das Betriebssystem prüfen, einschließlich der von der IT verteilten Root-Zertifikate der Firma.
python # Or verify with the operating system's store (macOS Keychain, Windows, Linux bundle) # pip install truststore==0.10.5 import truststore truststore.inject_into_ssl() - 4.
Auf Überschreibungen durch Umgebungsvariablen prüfen
Entferne SSL_CERT_FILE und SSL_CERT_DIR, wenn sie auf Dateien zeigen, die die nötigen Root-Zertifikate nicht enthalten.
bash env | grep -E '^SSL_CERT_(FILE|DIR)=' python3 -c "import ssl; print(ssl.get_default_verify_paths())"