Zum Inhalt springen
ecdsa.com
Python ssl module (OpenSSL)Python cryptography

Fehlermeldung

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain

Auch ausgegeben als

  • [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain

OpenSSL 3 gibt „self-signed“ aus, OpenSSL 1.1.1 „self signed“; Python hängt eine Quellcode-Position wie „(_ssl.c:1082)“ an. Über urllib erscheint die Meldung innerhalb von „<urlopen error …>“, über requests innerhalb von „Max retries exceeded … (Caused by SSLError(…))“.

Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN (19)

Was der Fehler bedeutet

Die Kette, die der Server vorgelegt hat, endet in einem selbstsignierten Root-Zertifikat, das nicht zu den CAs gehört, denen dieser Python-Prozess vertraut. Die Kette selbst ist vollständig; das Root-Zertifikat ist schlicht unbekannt. Tritt das bei öffentlichen Websites wie pypi.org oder api.github.com auf, gehört das Root-Zertifikat zu einem Proxy mit TLS-Inspektion oder zu einem Virenscanner in deinem Netzwerk oder auf deinem Rechner.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Herausfinden, wem das Root-Zertifikat gehört

    Gib die Kette für einen öffentlichen Host aus. Einem Root-Zertifikat, das nach deiner Firma oder einem Sicherheitsprodukt benannt ist, solltest du vertrauen; ein unbekannter Name in einem nicht vertrauenswürdigen Netzwerk ist ein Grund innezuhalten – nicht, ihm zu vertrauen.

    bash
    openssl s_client -connect pypi.org:443 -servername pypi.org -showcerts </dev/null 2>/dev/null \
      | grep -E '^ *[0-9]+ s:|^ *i:'
    # A top certificate named after your company or a security vendor = interception proxy
  2. 2.

    Mit dem Trust Store des Betriebssystems prüfen

    truststore.inject_into_ssl() bringt das TLS von Python dazu, den Trust Store des Betriebssystems zu verwenden, der die von deiner Organisation verteilten Root-Zertifikate bereits enthält. Auf verwalteten Windows- und macOS-Rechnern ist das die sauberste Lösung.

    python
    # pip install truststore==0.10.5
    import truststore
    truststore.inject_into_ssl()   # the proxy root deployed in the OS store is now trusted
    
    import requests
    requests.get("https://api.example.com/")
  3. 3.

    Bundle aus öffentlichen Root-Zertifikaten und deinem Root-Zertifikat erstellen

    REQUESTS_CA_BUNDLE (requests) und SSL_CERT_FILE (ssl, urllib, httpx) ersetzen das Standard-Bundle, deshalb hänge die Root-Zertifikate von certifi und das der Firma aneinander, statt nur auf das Root-Zertifikat der Firma zu verweisen.

    bash
    # Keep the public roots and add the company/proxy root
    cat "$(python3 -m certifi)" corp-root-ca.pem > ~/.config/corp-ca-bundle.pem
    export REQUESTS_CA_BUNDLE=~/.config/corp-ca-bundle.pem   # requests
    export SSL_CERT_FILE=~/.config/corp-ca-bundle.pem        # ssl, urllib, httpx
  4. 4.

    conda: eigene Einstellung konfigurieren

    conda liest ssl_verify aus .condarc; setze den Wert auf das kombinierte Bundle, damit conda install und conda update hinter dem Proxy funktionieren.

    bash
    # conda keeps its own OpenSSL and CA bundle
    conda config --set ssl_verify /path/to/corp-ca-bundle.pem

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen