Autorités de certification auto-signées pip
/ conda
Après avoir longuement documenté un problème similaire avec Git ( Comment puis-je faire en sorte que git accepte un certificat auto-signé ? ), nous voici à nouveau derrière un pare-feu d'entreprise avec un proxy qui nous donne une MitM "attaque" que nous devrions faire confiance et :
Ne désactivez JAMAIS toutes les vérifications SSL !
Cela crée une mauvaise culture de la sécurité. Ne soyez pas cette personne.
tl;dr
pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify
# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt
Mais où trouve-t-on ca-bundle.crt
?
Obtenez une liasse CA à jour
cURL publie un extrait des autorités de certification fournies avec Mozilla Firefox.
https://curl.haxx.se/docs/caextract.html
Je vous recommande d'ouvrir ce cacert.pem
dans un éditeur de texte, car nous devrons ajouter notre autorité de certification auto-signée à ce fichier.
Les certificats sont un document conforme à la norme X.509 mais ils peuvent être encodés sur le disque de plusieurs façons. L'article ci-dessous est une bonne lecture mais la version courte est que nous avons affaire à l'encodage base64 qui est souvent appelé PEM dans les extensions de fichiers. Vous verrez qu'il a le format :
----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----
https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them
Obtenir notre certificat auto-signé
Vous trouverez ci-dessous quelques options pour obtenir notre certificat auto-signé :
- Via OpenSSL CLI
- Via Browser
- Via Python Scripting
Obtenir notre certificat auto-signé par OpenSSL CLI
https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360
echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem
Obtenir notre autorité de certification auto-signée via le navigateur
Merci à cette réponse et au blog lié, il montre les étapes (sur Windows) comment visualiser le certificat et ensuite le copier dans un fichier en utilisant l'option d'encodage PEM base64.
Copier le contenu de ce fichier exporté et le coller à la fin de votre cacerts.pem
fichier.
Pour des raisons de cohérence, renommez ce fichier cacerts.pem
--> ca-bundle.crt
et le placer dans un endroit facile comme :
# Windows
%USERPROFILE%\certs\ca-bundle.crt
# Linux/macOS
$HOME/certs/cabundle.crt
Obtenir notre autorité de certification auto-signée via Python
Merci à toutes les réponses brillantes :
Comment obtenir le certificat SSL de réponse à partir des demandes en python ?
J'ai rassemblé les éléments suivants pour tenter d'aller un peu plus loin.
https://github.com/neozenith/get-ca-py
Enfin
Configurez pip et conda pour qu'ils sachent où se trouve le magasin de l'autorité de certification avec notre autorité de certification auto-signée supplémentaire.
# Windows
pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt
OU
# Linux / macOS
pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt
ALORS
pip config list
conda config --show ssl_verify
# Hot tip: use -v to show where your pip config file is...
pip config list -v
# Example output for macOS and homebrew installed python
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf'
For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'
Dépannage
Sur la base d'un excellent commentaire ci-dessous
J'ai essayé et j'ai toujours un SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)'))
erreur. Avez-vous des suggestions ?
voici un guide de dépannage :
Il s'agit du message d'erreur normal lorsque les autorités de certification ne sont pas encore correctement configurées.
Il peut s'agir de divers facteurs à vérifier :
- Les chemins vers votre ca-bundle.crt ont les bons séparateurs de chemin pour votre OS (cela m'a piqué),
- vous ne disposez peut-être pas des dernières AC pour vérifier les certificats normaux,
- vous n'avez peut-être pas ajouté votre CA dans le bon encodage.
Python réalise effectivement ces 3 étapes :
- Trouvez mon magasin en Californie,
- lire toutes les entrées,
- rechercher ce certificat dans mon magasin de confiance.
Si l'une d'entre elles échoue, vous obtenez ce message d'erreur de l'expérience.
Vérifiez cette réponse est liée à partir d'en bas pour afficher et vérifier votre ssl_cert_dir
en utilisant :
python -c "import ssl; print(ssl.get_default_verify_paths())"
Références
11 votes
@rfkortekaas Toutes ces options impliquent d'ajouter quelque chose de nouveau au processus. Python doit utiliser un magasin de confiance par défaut stocké quelque part sur le système. J'aimerais modifier ce magasin de confiance. Je ne veux pas ajouter de variables supplémentaires, de magasins de certificats différents, etc. En java, la jvm repose sur son propre magasin de confiance (séparé du système d'exploitation). Je soupçonne que Python doit faire quelque chose de similaire puisque mon certificat root est dans mon magasin Windows et non reconnu par Python.
2 votes
@eric_b vous devriez accepter une réponse.