175 votes

Comment ajouter un certificat CA Root personnalisé au magasin de CA utilisé par pip dans Windows ?

J'ai simplement installé Python3 depuis python.org et j'ai des problèmes pour installer des paquets avec pip. Par conception, il y a un appareil d'inspection de paquets de type man-in-the-middle sur le réseau ici qui inspecte tous les paquets (y compris ssl) en signant à nouveau toutes les connexions ssl avec son propre certificat. Une partie du GPO pousse le certificat racine personnalisé dans le Keystore de Windows.

Lorsque j'utilise Java, si j'ai besoin d'accéder à des sites externes en https, je dois mettre à jour manuellement les cacerts dans le JVM pour faire confiance au certificat CA autosigné.

Comment puis-je accomplir cela pour python? Actuellement, lorsque j'essaie d'installer des packages en utilisant pip, de manière compréhensible, je reçois de magnifiques erreurs [SSL: CERTIFICATE_VERIFY_FAILED].

Je réalise que je peux les ignorer en utilisant le paramètre --trusted-host, mais je ne veux pas le faire pour chaque package que j'essaie d'installer.

Y a-t-il un moyen de mettre à jour le magasin de certificats CA que python utilise?

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.

237voto

NeoZenith Points 197

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

10 votes

Une des plus grandes réponses de tous les temps

0 votes

Pip config set global.trusted-host XXXXX.com

0 votes

Dans Windows, cela fonctionne pour moi en utilisant le format .pem pour le certificat.

58voto

rfkortekaas Points 1823

Exécutez: python -c "import ssl; print(ssl.get_default_verify_paths())" pour vérifier les chemins actuellement utilisés pour vérifier le certificat. Ajoutez le certificat racine de votre entreprise à l'un de ceux-ci.

Le chemin openssl_capath_env pointe vers la variable d'environnement : SSL_CERT_DIR.

Si SSL_CERT_DIR n'existe pas, vous devrez le créer et le pointer vers un dossier valide dans votre système de fichiers. Vous pourrez ensuite ajouter votre certificat à ce dossier pour l'utiliser.

13 votes

Sur mon système Windows, cela renvoie '/usr/local/ssl/certs' qui n'est pas disponible sur Windows.

3 votes

Je me suis enfin occupé de cela aussi après avoir été jeté sur un autre projet, et similaire à @ColinTalbert, il pointe vers un dossier inexistant /usr/local/ssl/certs.

0 votes

J'ai édité ma question et j'espère que cela résout le problème.

30voto

nt86 Points 501

Une solution alternative sous Windows est d'installer python-certifi-win32 qui permettra à Python d'utiliser le magasin de certificats Windows.

pip install python-certifi-win32

12 votes

La première fois que vous souhaitez effectuer pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org python-certifi-win32

0 votes

Simple, mais a sauvé ma journée!

2 votes

Pas sûr comment mon installation était différente, mais en faisant cela (y compris les balises suggérées --trusted-host) s'est terminé avec succès, mais a cassé pip .. toutes les appels ultérieurs à pip ont planté, je ne pouvais même pas pip uninstall python-certifi-win32. J'ai renommé les fichiers manuellement pour que pip fonctionne à nouveau et prouve que c'était le coupable.

11voto

aturegano Points 450

Pas la meilleure réponse mais vous pouvez réutiliser un bundle CA déjà créé en utilisant l'option --cert de pip, par exemple :

pip install SQLAlchemy==1.1.15 --cert="C:\Users\monUtilisateur\certificats\mon_ca-bundle.crt"

11voto

Alex Points 85

Sous Windows, j'ai résolu le problème en créant un fichier pip.ini dans %APPDATA%\pip\

par exemple C:\Users\asmith\AppData\Roaming\pip\pip.ini

Dans le pip.ini, j'ai mis le chemin vers mon certificat :

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt

https://pip.pypa.io/en/stable/user_guide/#configuration a plus d'informations sur le fichier de configuration.

0 votes

Salut Alex, comment as-tu "inséré" le chemin de ton certificat dans le fichier pip.ini ? Depuis la ligne de commande ? As-tu tapé le chemin du fichier dans quelque chose comme le bloc-notes et l'as-tu enregistré en tant que fichier texte ? J'utilise Anaconda prompt, mais je pense que c'est similaire à Windows.

0 votes

J'ai créé un fichier texte avec Notepad, puis j'ai changé l'extension du fichier de "txt" à "ini".

0 votes

Ah. D'accord. Est-ce que tu dois aussi taper "[gobal]" au-dessus du chemin? Sais-tu où je peux trouver un tutoriel pour ce genre de chose? Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X