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)>
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.
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.
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é.
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%]
...
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:
pip3 install --update certify
dans un shellNotez que vous obtiendrez un lien symbolique cert.pem dans: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/