Как заставить 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.

Так вот что я сделал:

  1. вручную побежал pip3 install --update certify в оболочке
  2. удалите строку install certifi из командного скрипта
  3. повторите сценарий, и все будет хорошо.

обратите внимание, что вы получите сертификат.символическая ссылка Пэм в: /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%]
...