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?
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.
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
?
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----
Voici quelques options pour obtenir notre certificat auto-signé:
echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem
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
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
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
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.
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"
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.