Fehlermeldung
There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
Auch ausgegeben als
- Could not fetch URL https://pypi.example.com/simple/requests/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
pip gibt die Meldung als „Could not fetch URL <url>: There was a problem confirming the ssl certificate: … - skipping“ aus, nach mehreren Zeilen „WARNING: Retrying (Retry(total=…)) after connection broken by 'SSLError(…)'“. URL und abschließender Grund variieren.
pip — index or find-links URL over HTTPS (pip 24.2+ verifies with truststore by default)
Was der Fehler bedeutet
pip konnte das TLS-Zertifikat des Paketindex (oder einer find-links-URL) nicht prüfen, hat diese Seite deshalb übersprungen und endet meist mit „Could not find a version that satisfies the requirement“. Der Grund nach dem Doppelpunkt ist das Ergebnis der Prüfung durch OpenSSL. Seit pip 24.2 prüft pip über truststore mit dem Trust Store des Betriebssystems; entweder fehlt die CA also in diesem Trust Store, oder pip wurde angewiesen, ein anderes Bundle zu verwenden.
Warum der Fehler auftritt
Ein privater Index (Artifactory, Nexus, devpi) mit Firmenzertifikat
häufigInterne Paket-Mirrors verwenden Zertifikate einer Firmen-CA, die auf verwalteten Laptops vorhanden ist, aber nicht in CI-Images, Containern oder frisch aufgesetzten virtuellen Maschinen.
Ein Proxy mit TLS-Inspektion vor pypi.org
häufigIn Firmennetzwerken signiert der Proxy pypi.org und files.pythonhosted.org neu. Ohne sein Root-Zertifikat in dem Trust Store, den pip verwendet, scheitert jede Installation.
pip ist auf certifi statt auf den Trust Store des Betriebssystems eingestellt
gelegentlichMit --use-deprecated=legacy-certs, einer expliziten Einstellung cert, die auf certifi zeigt, oder mit pip unter Python 3.9 oder älter (wo truststore nicht verfügbar ist) werden Root-Zertifikate, die dem Trust Store des Betriebssystems hinzugefügt wurden, nicht verwendet.
Ein altes pip, das mit der Python-Installation ausgeliefert wurde
gelegentlichpip vor 24.2 hat immer sein mitgeliefertes certifi-Bundle verwendet. Viele Basis-Images und virtuelle Umgebungen enthalten noch solche Versionen.
So behebst du den Fehler
- 1.
CA im Trust Store des Betriebssystems installieren
Mit pip 24.2+ unter Python 3.10+ wird Root-Zertifikaten im Trust Store des Systems (oder im Schlüsselbund / Windows-Zertifikatsspeicher) automatisch vertraut. Aktualisiere pip, wenn es älter ist.
bash # pip >= 24.2 uses the OS trust store (truststore): add the CA there sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates python3 -m pip --version # upgrade pip itself if it is older than 24.2 - 2.
pip explizit ein CA-Bundle vorgeben
global.cert in der Konfiguration von pip, PIP_CERT oder --cert lassen pip mit dieser Datei prüfen. Nimm auch die öffentlichen Root-Zertifikate auf, wenn pip außerdem mit pypi.org kommuniziert.
bash # A CA bundle for pip only (one of these): python3 -m pip config set global.cert /etc/ssl/private-ca/corp-ca-bundle.pem export PIP_CERT=/etc/ssl/private-ca/corp-ca-bundle.pem python3 -m pip install --cert /etc/ssl/private-ca/corp-ca-bundle.pem requests - 3.
Privaten Index einmalig konfigurieren
Trage index-url und cert in die pip.conf (oder pip.ini) ein, damit jeder Aufruf von pip sie verwendet, auch Aufrufe innerhalb von Build-Tools.
ini # pip.conf (Linux: ~/.config/pip/pip.conf, Windows: %APPDATA%\pip\pip.ini) [global] index-url = https://pypi.example.com/simple/ cert = /etc/ssl/private-ca/corp-ca-bundle.pem - 4.
Vorübergehende Diagnose: --trusted-host
--trusted-host schaltet die Zertifikatsprüfung für diesen Host ab und erlaubt pip dort reines HTTP. Das bestätigt die Diagnose, aber alles, was so heruntergeladen wird, könnte unterwegs ausgetauscht worden sein; lass die Option nicht in der Konfiguration stehen.
bash # Temporary diagnostic only: --trusted-host disables certificate checks for that host python3 -m pip download --no-deps -d /tmp/dl --index-url https://pypi.example.com/simple/ \ --trusted-host pypi.example.com requests