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

85

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

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

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

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

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

Эрик Б.
источник
5
@rfkortekaas Все эти варианты включают добавление чего-то нового в процесс. Python должен использовать хранилище доверенных сертификатов по умолчанию, которое хранится где-то в системе. Я хотел бы изменить это хранилище доверия. Я не хочу добавлять дополнительные переменные, различные хранилища CA и т. Д. В java jvm полагается на собственное хранилище доверенных сертификатов (отдельно от ОС). Я подозреваю, что python должен делать что-то подобное, поскольку мой корневой сертификат находится в моем магазине Windows и не распознается python.
Эрик Б.

Ответы:

98

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

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

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

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

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 в расширениях файлов. Вы увидите, что он имеет формат:

----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

/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'

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

Джош Пик
источник
6
Один из величайших ответов всех времен
Кевин Паули
pip config set global.trusted-host XXXXX.com
zzzz zzzz
В Windows это работает для меня, используя формат .pem для сертификата.
Даниэль Аргуэльес
1
@ DanielArgüelles, да, верно. Чаще всего вы можете избежать слияния пакета центра сертификации, но у меня было достаточно раз, когда нужен полный пакет, чтобы pip или conda могли проверять сертификаты для других серверов. В конечном итоге пакет по-прежнему является текстовым файлом с содержимым множества файлов pem. Рад, что это сработало, и вам не пришлось отключать проверку! : D
Джош Пик
42

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

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

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

rfkortekaas
источник
11
в моей системе Windows это возвращает '/ usr / local / ssl / certs', который недоступен в Windows.
Колин Талберт
1
Я наконец-то дошел до этого после того, как меня перетащили в другой проект, и, как и @ColinTalbert, он указывает на несуществующую папку /usr/local/ssl/certs.
Эрик Б.
Я отредактировал свой вопрос и, надеюсь, это решит проблему.
rfkortekaas
1
@rfkortekaas Обновление переменных SSL_CERT_FILE или SSL_CERT_DIR не помогло. Я только что создал новый вопрос SO для этой проблемы, поскольку это может быть не просто вопрос о том, как обновить файл PEM, а скорее о том, как заставить python получить доступ к правильным путям в cygwin / Windows.
Эрик Б.
1
Я старался. В итоге я создал файл pip.conf ~/.config/pip/pip.confс необходимыми настройками. Смотрите этот ответ .
Эрик Б.
7

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

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
Aturegano
источник
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 содержит дополнительную информацию о файле конфигурации.

Alex
источник
Привет, Алекс, как ты «поместил» путь к своему сертификату в файл pip.ini? Из командной строки? Вы ввели путь к файлу в блокноте и сохранили его как текстовый файл? Я использую приглашение анаконды, но я думаю, что оно похоже на Windows.
spacedustpi
Я создал текстовый файл с помощью Блокнота, а затем изменил расширение файла с «txt» на «ini».
Alex
Ах. Хорошо. Нужно ли вам также вводить «[gobal]» над путем? Вы знаете, где я могу найти руководство по подобным вещам? Благодарю.
spacedustpi 02
Да, вам тоже нужно ввести «[global]». Извините, я не знаю ни одного учебника, но pip.pypa.io/en/stable/user_guide/#configuration содержит дополнительную информацию.
Alex
Спасибо, я попробовал оба варианта, и да, "[global]" не повредит.
spacedustpi
1

Альтернативным решением в Windows является установка python-certifi-win32, который позволит Python использовать хранилище сертификатов Windows.

pip install python-certifi-win32
NT86
источник
0

Я думаю, что решение nt86 является наиболее подходящим, поскольку оно использует базовую инфраструктуру Windows (хранилище сертификатов). Но он не объясняет, как установить python-certifi-win32 для начала, поскольку pip не работает.

Хитрость заключается в том, --trustedhostчтобы установить python-certifi-win32, а затем, после этого, pip автоматически использует хранилище сертификатов Windows для загрузки сертификата, используемого прокси.

Итак, вкратце, вам следует сделать:

pip install python-certifi-win32 -trustedhost pypi.org

и после этого вам должно быть хорошо идти

TonyM
источник
-1

Откройте Anaconda Navigator.

Перейдите в File \ Preferences.

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

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

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

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

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

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

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

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

Itsergiu
источник