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

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

  1. Вручную pip3 install --update certify в оболочке
  2. Удалите строку установки сертификата из командного сценария
  3. Переписал сценарий и все было хорошо.

Обратите внимание, что в итоге вы получите символическую ссылку /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/ в: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/