Zum Inhalt springen
ecdsa.com
Python urllib.requestPython cryptography

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

So behebst du den Fehler

  1. 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. 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. 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. 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())"

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen