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
Ein Firmen-Proxy oder Virenscanner fängt HTTPS ab
häufigDie IT hat das Root-Zertifikat der TLS-Inspektion im Zertifikatsspeicher von Windows oder macOS installiert, deshalb funktionieren Browser. Das OpenSSL von Python und Bibliotheken, die das certifi-Bundle verwenden, lesen diese Speicher nicht.
requests, pip oder httpx prüfen mit certifi
häufigcertifi enthält nur die öffentlichen Root-Zertifikate von Mozilla. Fügst du das Root-Zertifikat der Firma dem Zertifikatsspeicher des Systems hinzu, ändert das nichts an der Datei von certifi, und ein Upgrade von certifi per pip überschreibt manuelle Änderungen.
Ein interner Dienst sendet sein privates Root-Zertifikat
gelegentlichInterne APIs, deren Zertifikate eine Firmen-CA signiert hat und die das Root-Zertifikat in der Kette mitsenden, brauchen dieses Root-Zertifikat trotzdem in der Konfiguration des Clients.
conda, pyenv oder eine virtuelle Umgebung mit eigenem Bundle
gelegentlichconda bringt ein eigenes OpenSSL und ein eigenes CA-Bundle mit; eine Korrektur am System-Python erreicht es nicht.
So behebst du den Fehler
- 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.
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.
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.
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
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local…Python ssl module (OpenSSL)[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certifi…Python ssl module (OpenSSL)There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FA…pipcurl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)