Как добавить пользовательский корневой сертификат CA в CA Store, используемый pip в Windows?

Я только что установил Python3 с python.org и у меня возникли проблемы с установкой пакетов с помощью pip. По дизайну в сети есть устройство для проверки пакетов "человек в середине", которое проверяет все пакеты (включая ssl), отменяя все соединения ssl со своим собственным сертификатом. Часть объекта групповой политики подталкивает пользовательский корневой сертификат в хранилище ключей Windows.

При использовании Java, если мне нужно получить доступ к любым внешним сайтам https, мне нужно вручную обновить cacerts в JVM, чтобы доверять сертификату CA с самоподпиской.

Как это сделать для python? Прямо сейчас, когда я пытаюсь установить пакеты с помощью pip, понятно, я получаю замечательные ошибки [SSL: CERTIFICATE_VERIFY_FAILED].

Я понимаю, что могу игнорировать их с помощью параметра --trusted-host, но я не хочу этого делать для каждого пакета, который я пытаюсь установить.

Есть ли способ обновить хранилище сертификатов CA, которое использует python?

Ответы

Ответ 1

Запустите: python -c "import ssl; print(ssl.get_default_verify_paths())", чтобы проверить текущие пути, которые используются для проверки сертификата. Добавьте корневой сертификат вашей компании в один из них.

Путь openssl_capath_env указывает на переменную окружения: SSL_CERT_DIR.

Если SSL_CERT_DIR не существует, вам нужно будет создать его и указать в допустимую папку в вашей файловой системе. Затем вы можете добавить свой сертификат в эту папку, чтобы использовать его.

Ответ 2

Самозаверяющие центры сертификации pip/conda

После подробного документирования аналогичной проблемы с Git (Как я могу заставить git принимать самозаверяющий сертификат?), Мы снова за корпоративным брандмауэром с прокси, который дает нам "атаку" MitM, которой мы должны доверять, и:

НИКОГДА не отключайте все проверки SSL!

Это создает плохую культуру безопасности. Не будь таким человеком.

ТЛ; др

pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify

# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt

Но где мы можем получить ca-bundle.crt?


Получить актуальную CA Bundle

cURL публикует выдержку из Центров сертификации в комплекте с Mozilla Firefox

https://curl.haxx.se/docs/caextract.html

Я рекомендую вам открыть этот файл cacert.pem в текстовом редакторе, так как нам нужно будет добавить наш самозаверяющий CA в этот файл.

Сертификаты - это документ, соответствующий X.509, но их можно закодировать на диск несколькими способами. Приведенная ниже статья хорошо читается, но короткая версия заключается в том, что мы имеем дело с кодировкой base64, которую в расширениях файлов часто называют PEM. Вы увидите, что он имеет формат:

----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


Получение нашего самоподписанного сертификата

Ниже приведены несколько вариантов получения нашего собственного сертификата:

  • Через OpenSSL CLI
  • Через браузер
  • С помощью скриптов Python

Получите наш самоподписанный сертификат от OpenSSL CLI

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

Получите наш самозаверяющий центр сертификации через браузер

Благодаря этому ответу и связанному блогу, он показывает шаги (в Windows), как просмотреть сертификат, а затем скопировать в файл, используя опцию кодирования PEM base64.

Скопируйте содержимое этого экспортированного файла и вставьте его в конец файла cacerts.pem.

Для согласованности переименуйте этот файл в cacerts.pemca-bundle.crt и поместите его где-нибудь легко, например:

# Windows
%USERPROFILE%\certs\ca-bundle.crt

# or *nix
$HOME/certs/cabundle.crt

Получите наш самозаверяющий центр сертификации через Python

Спасибо за все блестящие ответы в:

Как получить ответный SSL-сертификат на запросы в python?

Я собрал следующее, чтобы попытаться сделать еще один шаг вперед.

https://github.com/neozenith/get-ca-py


в заключение

Установите конфигурацию в pip и conda, чтобы она знала, где находится это хранилище CA, с нашим дополнительным самозаверяющим CA.

pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

ИЛИ ЖЕ

pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt

ЗАТЕМ

pip config list
conda config --show ssl_verify

Рекомендации

Ответ 3

Не лучший ответ, но вы можете использовать уже созданный ча сверток, используя --cert вариант pip, например:

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"

Ответ 4

В Windows я решил это, создав файл pip.ini в% APPDATA%\pip\

например C:\Users\asmith\AppData\Roaming\pip\pip.ini

В pip.ini я поставлю путь к моему сертификату:

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt

https://pip.pypa.io/en/stable/user_guide/#configuration содержит дополнительную информацию о файле конфигурации.

Ответ 5

Откройте Анаконда Навигатор.

Перейдите в Файл\Настройки.

Включить проверку SSL Отключить (не рекомендуется)

или Включить и указать путь к сертификату SSL (Необязательно)

Обновите пакет до определенной версии:

Выберите Установить вверху справа

Выберите пакет нажмите на галочку

Отметить для обновления

Отметить для конкретной версии установки

Нажмите Применить