Как заставить Python использовать сертификаты CA из Mac Trust Trust?
Мне нужно использовать корневые сертификаты curtom в интрасети компании, а загрузка их в Mac OS TrustStore (KeyChain) решает проблему для всех браузеров и приложений графического интерфейса.
Кажется, что он работает даже с версией 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.
Ответы
Ответ 1
Если вы добавите дополнительные сертификаты в файл пакета PEM, вы можете использовать эти две переменные среды, чтобы перезаписать хранилища сертификатов по умолчанию, используемые Python openssl и запросами.
SSL_CERT_FILE=/System/Library/OpenSSL/cert.pem
REQUESTS_CA_BUNDLE=/System/Library/OpenSSL/cert.pem
Обратите внимание, что этот файл не существует, вам нужно его самостоятельно создать.
Ответ 2
Это также проблема в 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
или
Установите сертификационный пакет с помощью
pip install certifi
Я выбрал первый вариант, и он работал.
Ответ 3
В качестве обновления и назначения данных я столкнулся с этой проблемой при запуске 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%]
...
Ответ 4
Mac brew установить python env.
$ python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import certifi
>>> certifi.where()
'/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/certifi/cacert.pem'
>>>
Или из командной строки:
$ python -m certifi
тогда нужно ссылку cacert.pem как cert.pem
$ ln -s /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/certifi/cacert.pem cert.pem
$ pwd
/Library/Frameworks/Python.framework/Versions/3.7/etc/openssl
rehash
тогда отлично работает.
Ответ 5
Запустите это, чтобы установить соответствующие переменные. Это комбинация ответов, которые уже были даны здесь. Поместите его в свой ~/.bash_profile, чтобы сделать его постоянным.
CERT_PATH=$(python -m certifi)
export SSL_CERT_FILE=${CERT_PATH}
export REQUESTS_CA_BUNDLE=${CERT_PATH}
Ответ 6
Для меня /Applications/Python\ 3.6/./Install\ Certificates
команда завершается неудачно при установке pip certifi. Я использую Mac High Sierra и использую python3, поэтому pip несколько не работает, и вместо этого я должен использовать pip3.
Итак, вот что я сделал:
- Вручную
pip3 install --update certify
в оболочке - Удалите строку установки сертификата из командного сценария
- Переписал сценарий и все было хорошо.
Обратите внимание, что в итоге вы получите символическую ссылку /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/
в: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/