Как добавить пользовательский корневой сертификат 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----

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


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

Благодаря этому ответу и связанному блогу, он показывает шаги (в 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

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

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

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

Бежать: 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 (Необязательно)

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

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

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

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

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

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

Другие вопросы по тегам