web-dev-qa-db-fra.com

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

Je viens d'installer Python3 à partir de python.org et je ne parviens pas à installer les paquets avec pip. De par sa conception, il existe sur le réseau un dispositif d’inspection de paquets intermédiaire qui inspecte tous les paquets (SSL inclus) en renonçant à toutes les connexions SSL avec son propre certificat. Une partie de GPO pousse le certificat racine personnalisé dans le magasin de clés Windows.

Lors de l'utilisation de Java, si j'ai besoin d'accéder à des sites https externes, je dois mettre à jour manuellement les cacerts de la machine virtuelle Java pour qu'ils fassent confiance au certificat d'auto-signature de l'autorité de certification.

Comment puis-je accomplir cela pour Python? Pour le moment, lorsque j'essaie d'installer des paquets en utilisant pip, il est compréhensible que je reçois de merveilleuses erreurs [SSL: CERTIFICATE_VERIFY_FAILED].

Je me rends compte que je peux les ignorer en utilisant le paramètre --trusted-Host, mais je ne veux pas le faire pour chaque paquet que j'essaie d'installer.

Existe-t-il un moyen de mettre à jour le magasin de certificats de certification que python utilise?

47
Eric B.

Autorités de certification autosignées pip/conda

Après avoir longuement documenté un problème similaire avec Git ( Comment puis-je faire accepter par git un certificat auto-signé? ), nous sommes de nouveau derrière un pare-feu d’entreprise avec un proxy nous donnant un MitM "attaque" que nous devrions faire confiance et:

NE JAMAIS désactiver toutes les vérifications SSL!

Cela crée une mauvaise culture de sécurité. Ne sois 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ù obtenons-nous ca-bundle.crt?


Obtenez un bundle 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 fichier 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 à X.509, mais ils peuvent être codés sur le disque de plusieurs manières. L'article ci-dessous est une bonne lecture, mais la version courte indique que nous traitons du codage base64, souvent appelé PEM dans les extensions de fichier. 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é

Voici quelques options pour obtenir notre certificat auto-signé:

  • Via OpenSSL CLI
  • Via navigateur
  • Via Python Script

Obtenez notre certificat auto-signé par OpenSSL CLI

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#46836

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

Obtenez notre autorité de certification auto-signée via un navigateur

Grâce à cette réponse et au blog lié, il indique aux étapes (sous Windows) comment afficher le certificat puis les copier dans un fichier à l’aide de l’option de codage PEM base64.

Copiez le contenu de ce fichier exporté et collez-le à la fin de votre fichier cacerts.pem.

Par souci de cohérence, renommez ce fichier cacerts.pem -> ca-bundle.crt et placez-le dans un endroit simple comme:

# Windows
%USERPROFILE%\certs\ca-bundle.crt

# or *nix
$HOME/certs/cabundle.crt

Obtenez notre autorité de certification auto-signée via Python

Merci à toutes les réponses brillantes dans:

Comment obtenir un certificat SSL de réponse à partir de requêtes en python?

J'ai rassemblé les éléments suivants pour tenter d'aller plus loin.

https://github.com/neozenith/get-ca-py


Finalement

Définissez la configuration dans pip et conda pour qu'il sache où se trouve ce magasin d'autorité de certification avec notre autorité de certification autosignée.

pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

OR

pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt

ENSUITE

pip config list
conda config --show ssl_verify

Références

43
Josh Peak

Exécuter: python -c "import ssl; print(ssl.get_default_verify_paths())" pour vérifier les chemins actuels 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 sur la variable d'environnement: SSL_CERT_DIR.

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

32
rfkortekaas

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

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
7
aturegano

Sous Windows, je l'ai résolu en créant un fichier pip.ini dans% APPDATA%\pip \

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

Dans le pip.ini je mets le chemin vers mon certificat:

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

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

3
Alex