Message d’erreur
There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
Également affiché sous la forme
- 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 l’affiche sous la forme « Could not fetch URL <url>: There was a problem confirming the ssl certificate: … - skipping », après plusieurs lignes « WARNING: Retrying (Retry(total=…)) after connection broken by 'SSLError(…)' ». L’URL et la raison finale varient.
pip — index or find-links URL over HTTPS (pip 24.2+ verifies with truststore by default)
Ce que cela signifie
pip n’a pas pu vérifier le certificat TLS de l’index de paquets (ou d’une URL find-links) ; il a donc ignoré cette page et se termine généralement par « Could not find a version that satisfies the requirement ». La raison qui suit les deux-points est le résultat de la vérification par OpenSSL. Depuis pip 24.2, pip vérifie les certificats avec le magasin de confiance du système d’exploitation via truststore : soit l’AC est absente du magasin du système, soit pip est configuré pour utiliser un autre fichier d’AC.
Pourquoi cela se produit
Un index privé (Artifactory, Nexus, devpi) avec un certificat d’entreprise
fréquenteLes miroirs de paquets internes utilisent des certificats émis par une AC d’entreprise, présente sur les ordinateurs portables gérés, mais pas dans les images de CI, les conteneurs ou les machines virtuelles fraîchement créées.
Un proxy d’inspection TLS devant pypi.org
fréquenteSur les réseaux d’entreprise, les certificats de pypi.org et de files.pythonhosted.org sont signés à nouveau par le proxy. Sans la racine de celui-ci dans le magasin de confiance qu’utilise pip, chaque installation échoue.
pip est configuré pour utiliser certifi au lieu du magasin du système
occasionnelleAvec --use-deprecated=legacy-certs, un paramètre cert explicite qui pointe vers certifi, ou pip exécuté sous Python 3.9 ou antérieur (où truststore n’est pas disponible), les racines ajoutées au magasin du système ne sont pas utilisées.
Un ancien pip fourni avec l’installation de Python
occasionnelleAvant la version 24.2, pip utilisait toujours sa propre copie du fichier d’AC de certifi. De nombreuses images de base et de nombreux environnements virtuels fournissent encore de telles versions.
Comment corriger l’erreur
- 1.
Installer l’AC dans le magasin de confiance du système
Avec pip 24.2+ sous Python 3.10+, les racines du magasin du système (ou du Trousseau / du magasin Windows) sont approuvées automatiquement. Mettez pip à niveau s’il est plus ancien.
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.
Indiquer explicitement un fichier d’AC à pip
global.cert dans la configuration de pip, PIP_CERT ou --cert amènent pip à vérifier les certificats avec ce fichier. Incluez-y aussi les racines publiques si pip communique également avec pypi.org.
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.
Configurer l’index privé une fois pour toutes
Placez index-url et cert dans pip.conf (ou pip.ini) pour que chaque invocation de pip, y compris depuis des outils de build, les utilise.
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.
Diagnostic temporaire : --trusted-host
--trusted-host désactive la vérification des certificats pour cet hôte et autorise pip à y utiliser du HTTP en clair. L’option confirme le diagnostic, mais tout ce qui est téléchargé de cette façon a pu être remplacé en transit ; ne la conservez pas dans la configuration.
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