Как заставить Python использовать сертификаты CA из Mac OS TrustStore?
мне нужно использовать корневые сертификаты curtom в интрасети компании и загружать их в Mac OS TrustStore (KeyChain) решает проблему для всех браузеров и приложений GUI.
кажется, что он работает даже с версией curl
это поставляется с Mac OS X, но это не работает с python, даже версия, которая поставляется с Mac OS 10.12 Sierra (Python 2.7.10)
тем не менее, кажется, что я был бы поражен:
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
как я могу решить это?
потому что я сталкиваюсь с этой проблемой во многих и многих инструментах Python, я был бы очень признателен, если бы нашел способ избежать этого, не исправляя их.
предоставление пользовательского сертификата CA не является вариантом, потому что я не могу исправить десятки инструментов Python, которые я использую.
большинство инструментов используют requests
библиотека, но есть несколько, которые используют встроенную поддержку ssl в Python напрямую.
4 ответов
Это также проблема в Python 3.6 с MacOS Sierrra. Я знаю, что твой вариант использования другой. Но я наткнулся на эту тему, исследуя эту проблему. Поэтому, если у кого - то также есть эта статья, стоит проверить:
http://www.cdotson.com/2017/01/sslerror-with-python-3-6-x-on-macos-sierra/
в двух словах: Python 3.6 больше не полагается на openSSL MacOS. Он поставляется с собственным openSSL в комплекте и не имеет доступ к корневым сертификатам MacOS.
у вас есть два варианта:
запустите команду установки, поставляемую с Python 3.6
cd /Applications/Python\ 3.6/
./Install\ Certificates.command
или
установить certifi пакет
Я выбрал первый вариант и он сработал.
Если вы поместите дополнительные сертификаты в файл пакета PEM, вы можете использовать эти две переменные среды для перезаписи хранилищ сертификатов по умолчанию, используемых Python openssl и запросами.
SSL_CERT_FILE=/System/Library/OpenSSL/cert.pem
REQUESTS_CA_BUNDLE=/System/Library/OpenSSL/cert.pem
обратите внимание, что этот файл не существует, вам нужно построить его самостоятельно.
для меня /Applications/Python\ 3.6/./Install\ Certificates
команда не выполняется при установке pip certifi. Я на mac High Sierra и использую python3, поэтому pip несколько терпит неудачу, и вместо этого я должен использовать pip3.
Так вот что я сделал:
- вручную побежал
pip3 install --update certify
в оболочке - удалите строку install certifi из командного скрипта
- повторите сценарий, и все будет хорошо.
обратите внимание, что вы получите сертификат.символическая ссылка Пэм в: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/
в качестве обновления и точки данных я столкнулся с этой проблемой под управлением Python 3.7.0 на 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)
инструкции по решению проблемы находятся в /Applications/Python\ 3.7/ReadMe.rtf
следуя предложению там и работает /Applications/Python\ 3.7/Install\ Certificates.command
решена проблема:
из терминала:
$ /Applications/Python\ 3.7/Install\ Certificates.command
повторный запуск IPython...
$ ipython
>>> import bokeh.sampledata
>>> bokeh.sampledata.download()
Using data directory: /Users/me/.bokeh/data
Downloading: CGM.csv (1589982 bytes)
1589982 [100.00%]
...