Как добавить пользовательский корневой сертификат CA в CA Store, используемый Python в Windows?
Я только что установил Python3 с python.org и у меня возникают проблемы при установке пакетов с pip
, По замыслу, в сети имеется устройство проверки пакетов "человек посередине", которое проверяет все пакеты (включая ssl), переустанавливая все ssl-соединения со своим собственным сертификатом. Часть объекта групповой политики помещает пользовательский корневой сертификат в хранилище ключей Windows.
При использовании Java, если мне нужно получить доступ к каким-либо внешним https-сайтам, мне нужно вручную обновить касцеры в JVM, чтобы они доверяли сертификату Self-Signed CA.
Как мне сделать это для Python? Прямо сейчас, когда я пытаюсь установить пакеты, используя pip
Понятно, я получаю замечательно [SSL: CERTIFICATE_VERIFY_FAILED]
ошибки.
Я понимаю, что могу игнорировать их, используя --trusted-host
параметр, но я не хочу делать это для каждого пакета, который я пытаюсь установить.
Есть ли способ обновить хранилище сертификатов CA, которое использует python?
11 ответов
Самоподписанные центры сертификации 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----
Получите наш самозаверяющий центр сертификации через браузер
- Получение вашего CA: /questions/27306952/ne-udalos-obnovit-conda-oshibka-ssl-sboj-proverki-sertifikata-ssl-certificateverifyfailed/27306959#27306959
Благодаря этому ответу и связанному блогу, он показывает шаги (в 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
Получите наш самоподписанный сертификат от OpenSSL CLI
echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem
в заключение
Установите конфигурацию в 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
Рекомендации
- Pip SSL: https://pip.pypa.io/en/stable/user_guide/
- Конда SSL: /questions/27306952/ne-udalos-obnovit-conda-oshibka-ssl-sboj-proverki-sertifikata-ssl-certificateverifyfailed/27306961#27306961
- Получение вашего CA: /questions/27306952/ne-udalos-obnovit-conda-oshibka-ssl-sboj-proverki-sertifikata-ssl-certificateverifyfailed/27306959#27306959
- Использование Python для автоматического захвата вашего Peer CA: Как получить ответный SSL-сертификат на запросы в python?
Бежать: python -c "import ssl; print(ssl.get_default_verify_paths())"
проверить текущие пути, которые используются для проверки сертификата. Добавьте корневой сертификат вашей компании к одному из них.
Путь openssl_capath_env
указывает на переменную среды: SSL_CERT_DIR
,
Если SSL_CERT_DIR
не существует, вам нужно будет создать его и указать правильную папку в вашей файловой системе. Затем вы можете добавить свой сертификат в эту папку, чтобы использовать его.
Альтернативным решением в Windows является установка python-certifi-win32, который позволит Python использовать хранилище сертификатов Windows.
pip install python-certifi-win32
В 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/ содержит дополнительную информацию о файле конфигурации.
Не лучший ответ, но вы можете повторно использовать уже созданный пакет, используя --cert
вариант pip
, например:
pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
Я думаю, что решение nt86 является наиболее подходящим, поскольку оно использует базовую инфраструктуру Windows (хранилище сертификатов). Но он не объясняет, как установить python-certifi-win32 для начала, поскольку pip не работает.
Хитрость в том, чтобы использовать
--trustedhost
чтобы установить python-certifi-win32, а затем, после этого, pip будет автоматически использовать хранилище сертификатов Windows для загрузки сертификата, используемого прокси.
Итак, вкратце, вам следует сделать:
pip install python-certifi-win32 -trustedhost pypi.org
и после этого вам должно быть хорошо идти
Я не могу комментировать ни «Величайший ответ всех времен» Джоша, ни rfKortteka как менее эпический, но также полезный из-за слишком малого количества очков репутации, так что вот еще один намек. В моем случае эта ошибка:
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась: невозможно получить сертификат локального эмитента (_ssl.c:1123)')) ошибка.
потребовалось, чтобы я нашел и добавил вcacerts.pem
/ca-bundle.crt
- сертификат для промежуточных центров сертификации (для самоподписанного сертификата, который я пытался добавить)
- Промежуточный корневой сертификат для этого промежуточного центра сертификации.
Я получил их, экспортировав правильные сертификаты из certmgr.msc на свою машину (это своего рода ситуация корпоративного VPN-ада, только pip & certify, методы, перечисленные в других ответах, для меня недоступны). Кроме того, дружеское напоминание о необходимости перезагрузить компьютеры при добавлении переменных среды (SSL_CERT_DIR
,SSL_CERT_FILE
) похоже не работает ;)
В моем сценарии на Ubuntu с использованием Python 3.8 я хотел посмотреть, что я могу изменить в своей локальной системе (а не код или установка нового пакета), что позволит мне использовать мой собственный ЦС и мои самозаверяющие сертификаты.
Так что я просто проследил, куда смотрел python:
strace python my_prog 2> out.txt
Затем просмотрел вывод для pem (возможно, вам придется искать «crt» «cert»)
grep -i pem out.txt
Несмотря на то, что certifi никогда не устанавливался явно, файл, который он искал, был:
/path/to/virtualenv/for/project/lib/python3.8/site-packages/certifi/cacert.pem
Поэтому я переименовал старый файл и связал его с пакетом CA моей системы (например, /etc/ssl/certs/ca-certificates.crt).
И теперь это сработало.
В этом посте:
https://github.com/jorgenschaefer/elpy/issues/1936
они советуют:
M-x elpy-rpc-reinstall-virtualenv
Это сработало для меня.
В корпоративной среде, где брандмауэр использует сертификат, выданный внутренним центром сертификации: вам необходимо добавить содержимое общедоступного сертификата вашей цепочки микропрограммного обеспечения и центра сертификации в «C:\Python311\Lib\site-packages\pip_vendor\certifi\cacert». .pem"
Откройте Анаконда Навигатор.
Перейдите в Файл \ Настройки.
Включить проверку SSL Отключить (не рекомендуется)
или Включить и указать путь к сертификату SSL (Необязательно)
Обновите пакет до определенной версии:
Выберите Установить вверху справа
Выберите пакет нажмите на галочку
Отметить для обновления
Отметить для конкретной версии установки
Нажмите Применить