Як додати власний кореневий сертифікат CA до магазину CA, який використовується pip у Windows?


85

Я щойно встановив Python3 з python.org і маю проблеми з установкою пакетів pip. За задумом, тут в мережі є пристрій перевірки пакетів "людина посередині", який перевіряє всі пакети (включаючи ssl), звільнивши всі з'єднання ssl за власним сертифікатом. Частина об’єкта групової політики надсилає спеціальний кореневий сертифікат до сховища ключів Windows.

При використанні Java, якщо мені потрібен доступ до будь-яких зовнішніх сайтів https, мені потрібно вручну оновити cacerts у JVM, щоб довірити сертифікат самопідписаного ЦС.

Як це зробити для 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; д-р

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), як переглянути сертифікат, а потім скопіювати у файл, використовуючи опцію кодування 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, щоб вона знала, де знаходиться цей магазин ЦС, з нашим додатковим самопідписаним ЦС.

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його не існує, вам потрібно буде створити його та направити на дійсну папку у вашій файловій системі. Потім ви можете додати свій сертифікат до цієї папки, щоб використовувати його.


11
у моїй системі Windows це повертає '/ usr / local / ssl / certs', який недоступний у Windows.
Колін Талберт,

1
Нарешті мені довелося зробити це також після того, як мене перекинули на інший проект, і подібно до @ColinTalbert він вказує на неіснуючу папку /usr/local/ssl/certs.
Ерік Б.

Я відредагував своє запитання і, сподіваюся, це вирішує справу.
rfkortekaas

1
@rfkortekaas Оновлення змінних SSL_CERT_FILE або SSL_CERT_DIR не спрацювало. Я щойно створив нове запитання для цієї проблеми, оскільки це може бути не просто питання про те, як оновити файл 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"

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 містить додаткову інформацію про файл конфігурації.


Привіт Алекс, як ти "поставив" шлях до свого сертифіката у файлі pip.ini? З командного рядка? Ви ввели шлях до файлу у щось на зразок блокнота і зберегли його як текстовий файл? Я використовую підказку anaconda, але я думаю, що це схоже на windows.
spacedustpi

Я створив текстовий файл за допомогою Блокнота, а потім змінив розширення файлу з "txt" на "ini".
Алекс

Ага. Добре. Вам також потрібно ввести "[gobal]" над контуром? Чи знаєте ви, де я можу взяти підручник з подібних речей? Дякую.
spacedustpi

Так, вам також потрібно ввести "[глобальний]". На жаль, я не знаю жодного підручника, але pip.pypa.io/en/stable/user_guide/#configuration містить додаткову інформацію.
Алекс

Дякую, я випробував це в обох напрямках, і так, "[глобальний]" не заважає.
spacedustpi

1

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

pip install python-certifi-win32

0

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

Фокус полягає у використанні --trustedhostдля встановлення python-certifi-win32, а потім після цього pip автоматично використовуватиме сховище сертифікатів Windows для завантаження сертифіката, який використовується проксі-сервером.

Отже, у двох словах, ви повинні зробити:

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

і після цього вам слід добре піти


-1

Відкрийте Anaconda Navigator.

Перейдіть у меню Файл \ Налаштування.

Увімкнути перевірку SSL Вимкнути (не рекомендується)

або Увімкнути та вказати шлях до сертифіката SSL (Необов’язково)

Оновіть пакет до певної версії:

Виберіть Встановити вгорі праворуч

Виберіть пакет, клацніть на галочку

Позначити для оновлення

Позначте для встановлення конкретної версії

Клацніть Застосувати

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.