Message d’erreur
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain
Également affiché sous la forme
- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain
OpenSSL 3 affiche « self-signed », OpenSSL 1.1.1 « self signed » ; Python ajoute un emplacement dans le code source, comme « (_ssl.c:1082) ». Via urllib, le message apparaît dans « <urlopen error …> », via requests dans « Max retries exceeded … (Caused by SSLError(…)) ».
Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN (19)
Ce que cela signifie
La chaîne présentée par le serveur se termine par un certificat racine auto-signé qui ne figure pas parmi les AC auxquelles ce processus Python fait confiance. La chaîne elle-même est complète ; la racine est simplement inconnue. Lorsque cela se produit pour des sites publics comme pypi.org ou api.github.com, la racine appartient à un proxy d’inspection TLS ou à un antivirus présent sur votre réseau ou sur votre machine.
Pourquoi cela se produit
Un proxy d’entreprise ou un antivirus intercepte le HTTPS
fréquenteLa racine d’interception est installée par le service informatique dans le magasin Windows ou macOS, si bien que les navigateurs fonctionnent. L’OpenSSL de Python et les bibliothèques qui utilisent le fichier d’AC de certifi ne lisent pas ces magasins.
requests, pip ou httpx vérifient avec certifi
fréquentecertifi ne contient que les racines publiques de Mozilla. Ajouter la racine de l’entreprise au magasin du système ne modifie pas le fichier de certifi, et une mise à jour de certifi par pip écrase les modifications manuelles.
Un service interne envoie sa racine privée
occasionnelleMême lorsqu’elles servent la racine dans la chaîne, les API internes signées par une AC d’entreprise exigent que cette racine soit configurée sur le client.
conda, pyenv ou un environnement virtuel doté de son propre fichier d’AC
occasionnelleconda fournit son propre OpenSSL et son propre fichier d’AC ; une correction appliquée au Python du système ne l’atteint pas.
Comment corriger l’erreur
- 1.
Identifier à qui appartient la racine
Affichez la chaîne d’un hôte public. Une racine qui porte le nom de votre entreprise ou d’un produit de sécurité est celle à laquelle faire confiance ; un nom inconnu sur un réseau non fiable est une raison de s’arrêter, pas de lui faire confiance.
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.
Vérifier avec le magasin de confiance du système d’exploitation
truststore.inject_into_ssl() fait reposer le TLS de Python sur le magasin de confiance du système d’exploitation, qui contient déjà les racines déployées par votre organisation. C’est la correction la plus propre sur les machines Windows et macOS gérées.
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.
Constituer un fichier d’AC avec les racines publiques et votre racine
REQUESTS_CA_BUNDLE (requests) et SSL_CERT_FILE (ssl, urllib, httpx) remplacent le fichier d’AC par défaut : concaténez donc les racines de certifi avec la racine de l’entreprise au lieu de pointer uniquement vers la racine de l’entreprise.
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 : configurer son propre paramètre
conda lit ssl_verify dans .condarc ; faites-le pointer vers le fichier d’AC combiné pour que conda install et conda update fonctionnent derrière le proxy.
bash # conda keeps its own OpenSSL and CA bundle conda config --set ssl_verify /path/to/corp-ca-bundle.pem
Erreurs associées
[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)