Я только что установил Python3 с python.org, и у меня проблемы с установкой пакетов с расширением pip
. По замыслу, в сети есть устройство проверки пакетов «человек посередине», которое проверяет все пакеты (включая ssl), отменяя все ssl-соединения со своим собственным сертификатом. Часть объекта групповой политики помещает настраиваемый корневой сертификат в хранилище ключей Windows.
При использовании Java, если мне нужно получить доступ к каким-либо внешним https-сайтам, мне нужно вручную обновить cacerts в JVM, чтобы доверять сертификату Self-Signed CA.
Как мне сделать это для Python? Понятно, что прямо сейчас, когда я пытаюсь установить пакеты с помощью pip
, я получаю замечательные [SSL: CERTIFICATE_VERIFY_FAILED]
ошибки.
Я понимаю, что могу игнорировать их, используя --trusted-host
параметр, но я не хочу делать это для каждого пакета, который я пытаюсь установить.
Есть ли способ обновить хранилище сертификатов CA, которое использует python?
Ответы:
Самозаверяющие центры сертификации
pip
/conda
После тщательного документирования аналогичной проблемы с Git ( как я могу заставить git принимать самоподписанный сертификат? ), Мы снова находимся за корпоративным брандмауэром с прокси-сервером, который дает нам «атаку» MitM, которой мы должны доверять, и:
tl; dr
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
cURL публикует отрывок из центров сертификации, входящих в состав Mozilla Firefox.
https://curl.haxx.se/docs/caextract.html
Я рекомендую вам открыть этот
cacert.pem
файл в текстовом редакторе, так как нам нужно будет добавить в этот файл самозаверяющий ЦС.Сертификаты - это документ, соответствующий X.509, но их можно закодировать на диск несколькими способами. Приведенная ниже статья хорошо читается, но краткая версия заключается в том, что мы имеем дело с кодировкой base64, которая часто называется PEM в расширениях файлов. Вы увидите, что он имеет формат:
https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them
Получение нашего самоподписанного сертификата
Ниже приведены несколько вариантов получения нашего самоподписанного сертификата:
Получите наш самоподписанный сертификат с помощью OpenSSL CLI
/unix/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), как просмотреть сертификат, а затем скопировать его в файл с помощью опции кодирования base64 PEM.
Скопируйте содержимое этого экспортированного файла и вставьте его в конец
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 # Hot tip: use -v to show where your pip config file is... pip config list -v # Example output for macOS and homebrew installed python For variant 'global', will try loading '/Library/Application Support/pip/pip.conf' For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf' For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf' For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'
Рекомендации
источник
Выполнить:
python -c "import ssl; print(ssl.get_default_verify_paths())"
чтобы проверить текущие пути, которые используются для проверки сертификата. Добавьте корневой сертификат вашей компании в один из них.Путь
openssl_capath_env
указывает на переменную окружения:SSL_CERT_DIR
.Если
SSL_CERT_DIR
не существует, вам нужно будет создать его и указать на действительную папку в вашей файловой системе. Затем вы можете добавить свой сертификат в эту папку, чтобы использовать его.источник
/usr/local/ssl/certs
.~/.config/pip/pip.conf
с необходимыми настройками. Смотрите этот ответ .Не лучший ответ, но вы можете повторно использовать уже созданный пакет ca, используя , например,
--cert
опциюpip
:pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
источник
В 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 содержит дополнительную информацию о файле конфигурации.
источник
Альтернативным решением в Windows является установка python-certifi-win32, который позволит Python использовать хранилище сертификатов Windows.
источник
Я думаю, что решение nt86 является наиболее подходящим, поскольку оно использует базовую инфраструктуру Windows (хранилище сертификатов). Но он не объясняет, как установить python-certifi-win32 для начала, поскольку pip не работает.
Хитрость заключается в том,
--trustedhost
чтобы установить python-certifi-win32, а затем, после этого, pip автоматически использует хранилище сертификатов Windows для загрузки сертификата, используемого прокси.Итак, вкратце, вам следует сделать:
и после этого вам должно быть хорошо идти
источник
Откройте Anaconda Navigator.
Перейдите в File \ Preferences.
Включить проверку SSL Отключить (не рекомендуется)
или Включите и укажите путь сертификата SSL (необязательно)
Обновите пакет до конкретной версии:
Выберите Установить в правом верхнем углу.
Выберите пакет нажмите на галочку
Отметить для обновления
Отметить для установки конкретной версии
Нажмите Применить
источник