web-dev-qa-db-fra.com

Comment faire en sorte que Python utilise les certificats de l'autorité de certification à partir du fichier de stockage d'animation Mac OS?

Je dois utiliser des certificats racine curtom sur le réseau intranet de la société et les charger dans le magasin de fichiers de savoir-faire Mac OS (KeyChain) résout le problème pour tous les navigateurs et les applications à interface graphique.

Il semble que cela fonctionne même avec la version de curl fournie avec Mac OS X mais que ne fonctionne pas avec python, même la version fournie avec Mac OS 10.12 Sierra (Python 2.7.10)

Pourtant, il semble que je serais frappé par:

urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

Comment puis-je résoudre ça?

Parce que je rencontre ce problème dans de nombreux outils Python, j’apprécierais vraiment si je trouvais un moyen de l’éviter sans avoir à les corriger.

Fournir moi-même le certificat d'autorité de certification personnalisé n'est pas une option, car je ne peux pas appliquer des correctifs à des dizaines d'outils Python que j'utilise. 

La plupart des outils utilisent la bibliothèque requests, mais quelques-uns utilisent directement le support natif de ssl dans Python.

21
sorin

Si vous placez les certificats supplémentaires dans un fichier d'ensemble PEM, vous pouvez utiliser ces deux variables d'environnement pour écraser les magasins de certificats par défaut utilisés par Python openssl et ses demandes.

SSL_CERT_FILE=/System/Library/OpenSSL/cert.pem
REQUESTS_CA_BUNDLE=/System/Library/OpenSSL/cert.pem

Veuillez noter que ce fichier n'existe pas, vous devez le créer vous-même.

6
sorin

C’est également un problème dans Python 3.6 avec MacOS Sierrra. Je sais que votre cas d'utilisation est différent. Mais je suis tombé sur ce fil tout en enquêtant sur ce problème. Donc, si quelqu'un a aussi cet article vaut le détour:

http://www.cdotson.com/2017/01/sslerror-with-python-3-6-x-on-macos-sierra/

En bref: Python 3.6 ne s'appuie plus sur le logiciel openSSL de MacOS. Il est livré avec son propre paquet openSSL et n'a pas accès aux certificats racine de MacOS.

Vous avez deux options:

Exécuter une commande d'installation fournie avec Python 3.6

cd /Applications/Python\ 3.6/
./Install\ Certificates.command

ou

Installer le paquet certifi

J'ai choisi la première option et cela a fonctionné.

29
j7nn7k

En tant que mise à jour et point de données, j'ai rencontré ce problème sous Python 3.7.0 sur macOS 10.13.4:

$ ipython
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import bokeh.sampledata

In [2]: bokeh.sampledata.download()
Using data directory: /Users/me/.bokeh/data

...
SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)

Les instructions pour résoudre le problème sont en /Applications/Python\ 3.7/ReadMe.rtf

En suivant la suggestion, exécuter /Applications/Python\ 3.7/Install\ Certificates.command a résolu le problème:

Depuis le terminal:

$ /Applications/Python\ 3.7/Install\ Certificates.command

Redémarrer IPython ...

$ ipython
>>> import bokeh.sampledata

>>> bokeh.sampledata.download()
Using data directory: /Users/me/.bokeh/data
Downloading: CGM.csv (1589982 bytes)
   1589982 [100.00%]
...
0
JS.

Pour moi, la commande /Applications/Python\ 3.6/./Install\ Certificates échoue lors de l'installation de pip certifi. Je suis sur mac High Sierra et utilise python3, donc pip échoue quelque peu et je dois utiliser plutôt pip3. 

Alors voici ce que j'ai fait:

  1. Exécution manuelle de pip3 install --update certify dans un shell
  2. Supprimer la ligne d'installation certifi du script de commande
  3. Reran le script et tout allait bien.

Notez que vous obtiendrez un lien symbolique cert.pem dans: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/

0
Rocko