Как добавить пользовательский корневой сертификат 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.pem
→ ca-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 (Необязательно)
Обновите пакет до определенной версии:
Выберите Установить вверху справа
Выберите пакет нажмите на галочку
Отметить для обновления
Отметить для конкретной версии установки
Нажмите Применить