Могу ли я обойтись без использования “pip install –cert”?

Вопрос или проблема

Я пытаюсь разобраться, есть ли способ, чтобы мне не пришлось использовать флаг –cert для pip при установке пакетов на работе. Есть какая-то проблема с прокси, который позволяет мне скачивать необходимые пакеты только при указании этого флага, несмотря на то, что я добавил файл mycert.crt в /usr/local/share/ca-certificates и выполнил команду sudo update-ca-certificates.

Пример сообщений, которые я вижу:

$ pip install "virtualenv>=1.10.1"
Downloading/unpacking virtualenv>=1.10.1
  Не удалось получить URL https://pypi.python.org/simple/virtualenv/: Проблема с подтверждением ssl сертификата: <urlopen error [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed>
  Пропуск URL https://pypi.python.org/simple/virtualenv/ при поиске ссылок для скачивания virtualenv>=1.10.1
  Не удалось получить URL https://pypi.python.org/simple/: Проблема с подтверждением ssl сертификата: <urlopen error [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed>
  Пропуск URL https://pypi.python.org/simple/ при поиске ссылок для скачивания virtualenv>=1.10.1
  Не удается получить индексный базовый URL https://pypi.python.org/simple/
  Не удалось получить URL https://pypi.python.org/simple/virtualenv/: Проблема с подтверждением ssl сертификата: <urlopen error [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed>
  Пропуск URL https://pypi.python.org/simple/virtualenv/ при поиске ссылок для скачивания virtualenv>=1.10.1
  Не удалось найти ни одного из загружаемых пакетов, удовлетворяющих требованию virtualenv>=1.10.1
Очистка...
Не найдено ни одной дистрибуции для virtualenv>=1.10.1
Сохранен полный журнал в /tmp/tmpwW5qXD

Это можно исправить, используя:

pip install --cert=/usr/local/share/ca-certificates/mycert.crt

Тем не менее, я предпочел бы не делать этого (как я уверен, и другие приложения сталкиваются с этой проблемой).

Я использую Linux Mint 15 (хотя ранее у меня были очень похожие проблемы на Ubuntu 12.04), версия pip 1.4.1.

Вы можете установить это через конфигурационный файл pip, который находится в $HOME/.pip/pip.conf или %APPDATA%\pip\pip.ini в Windows:

[global]
cert = /usr/local/share/ca-certificate/mycert.crt

Этот файл позволяет вам установить практически все флаги, которые использует pip. Полная документация доступна по адресу https://pip.pypa.io/en/latest/user_guide/#configuration

Для меня ни один из обходных путей с конфигурационным файлом не сработал. Я использую pip 1.5.4 на Ubuntu 14.04

Что в конечном итоге сработало для меня, так это установка сертификата в системе сначала (в моем случае на ubuntu это будет)

sudo cp ~/my_cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

Предыдущая команда автоматически обновляет файл пакета (проверив внизу /etc/ssl/certs/ca-certificates.crt, вы должны теперь увидеть тот же сертификат, что и в my_cert.crt)

Теперь используйте этот путь в PIP_CERT. И добавьте его в мой .bashrc:

echo export PIP_CERT=/etc/ssl/certs/ca-certificates.crt >> ~/.bashrc

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я уже размещал этот ответ в SO (тот же ответ, что и в ‘в конечном итоге дублирующей ссылке выше’, но в начале я не нашел другой (в конечном итоге дублирующий ответ)… так что если кто-то, как я, доберется сюда первым, это может помочь.

Возможно, я нарушаю какие-то правила, размещая один и тот же ответ дважды, один в SO и другой на superuser. Если это так, извините за это.

Это сработало для меня без необходимости знать, где находится конфигурационный файл:

python -m pip config set global.cert C:\\Path\\cert.crt

Я считаю, вам нужна версия pip 10+, которую вы можете найти с помощью:

 python -m pip --version

Вывод команды конфигурации затем выводит название конфигурационного файла для вашего удобства

Если вы переходите между средами и вам нужны как оригинальные pip сертификаты, так и сертификаты вашей компании, вы можете объединить их вместе1:

cat /usr/local/share/ca-certificates/mycert.crt $(python3 -c "import certifi; print(certifi.where())") > /usr/local/share/ca-certificates/mycert-pip-bundle.crt

И установите pip для использования этого пакета глобально:

python3 -m pip config set global.cert /usr/local/share/ca-certificates/mycert-pip-bundle.crt

1 python3 -c "import certifi; print(certifi.where())" возвращает путь к пакету сертификатов, который используется по умолчанию pip, который не является системным хранилищем сертификатов (источник):

Начиная с версии 1.3, pip предоставляет подтверждение SSL сертификатов по HTTP, чтобы предотвратить атаки “человек посередине” против загрузок PyPI. Это не использует системное хранилище сертификатов, а вместо этого использует упакованное хранилище CA сертификатов. Упакованное по умолчанию хранилище CA сертификатов может быть переопределено с помощью флага --cert или используя переменные окружения PIP_CERT, REQUESTS_CA_BUNDLE или CURL_CA_BUNDLE.

Если вы находитесь за Zscaler, вот что сработало для меня.

pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org --no-cache-dir -r requirements.txt

Файл requirements.txt должен содержать все библиотеки, которые вы планируете загрузить, например:

  • fastapi
  • uvicorn
  • typing

Pip использует системное хранилище сертификатов по умолчанию, начиная с версии 24.2. Это должно устранить необходимость передавать --cert ... в корпоративных средах.

Эта функция существует, но не включена по умолчанию, начиная с версии 22.2. В этом случае документация гласит, что необходимо переключить --use-feature=truststore:

pip install SomePackage --use-feature=truststore

Это должно быть возможно настроить этот параметр навсегда, используя

pip config set global.use-feature=truststore

(аналогично примеру, который я нашел в руководстве пользователя)

Оставляю здесь заметку для себя и, надеюсь, для всех, кто использует Linux.

Это директории в Linux, в которых pip ищет файл конфигурации в порядке:

/etc/xdg/pip/pip.conf
/etc/pip.conf
$HOME/.pip/pip.conf
$HOME/.config/pip/pip.conf
$VIRTUALENV/pip.conf

Сегодня я столкнулся с этой проблемой, и ни один из обходных путей не сработал. Я нашел этот пост https://community.cisco.com/t5/cloud-security/umbrella-breaks-files-pythonhosted-org/td-p/3688704

и там упоминалось, что при устранении неполадок они изменили свой DNS на google (8.8.8.8), и проблема исчезла. Я только что попробовал это, и это сработало! Это ситуация, когда продукт фильтрации контента (CISCO Umbrella) нуждается в обновлении

Ответ или решение

Можно ли обойти использование флага "pip install –cert"?

Проблема, с которой вы столкнулись, связана с установкой пакетов Python через pip в условиях корпоративной сети, где возникают проблемы с проверкой SSL-сертификатов. Ваша конфигурация сети, возможно, требует явного указания сертификата для успешной установки пакетов. Рассмотрим, какие шаги можно предпринять, чтобы избежать постоянного использования флага --cert при установке пакетов.

1. Использование конфигурационного файла pip

Первый и наиболее удобный способ — это настроить конфигурационный файл для pip, чтобы он всегда использовал ваш сертификат. Вы можете создать или отредактировать файл ~/.pip/pip.conf (или %APPDATA%\pip\pip.ini на Windows), добавив в него следующие строки:

[global]
cert = /usr/local/share/ca-certificates/mycert.crt

Это позволит pip автоматически использовать заданный сертификат при всех установках пакетов, избегая необходимости каждый раз вручную указывать флаг --cert.

2. Переменная окружения PIP_CERT

Если конфигурационный файл по каким-то причинам не работает, вы можете использовать переменную окружения PIP_CERT. Для этого вам нужно выполнить следующую команду в терминале:

echo export PIP_CERT=/usr/local/share/ca-certificates/mycert.crt >> ~/.bashrc

После этого не забудьте перезапустить терминал или выполнить команду source ~/.bashrc, чтобы изменения вступили в силу.

3. Установка сертификатов в системное хранилище

Иногда система и приложения не распознают пользовательские сертификаты. Если вы не сделали этого ранее, попробуйте установить свой сертификат в системное хранилище сертификатов:

sudo cp ~/my_cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

После выполнения этих команд сертификат будет доступен для всех приложений на вашем компьютере.

4. Использование PIP и системных хранилищ сертификатов

С недавних пор, начиная с версии pip 24.2, была добавлена поддержка системного хранилища сертификатов по умолчанию. Это значит, что вам не нужно будет указывать сертификат каждый раз, если системное хранилище настроено правильно. Вы можете установить флаг по умолчанию:

pip config set global.use-feature truststore

5. Использование --trusted-host

Если у вас по-прежнему возникают проблемы при установке пакетов, вы можете указать pip доверять определённым хостам. Например:

pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org --no-cache-dir -r requirements.txt

Это временное решение, которое может помочь в ситуациях, когда возникают проблемы с сертификатом.

Заключение

Представленные выше методы позволят вам избежать постоянного указания флага --cert при установке пакетов с помощью pip. Настройка конфигурационного файла и установка сертификатов в системное хранилище являются наиболее эффективными и устойчивыми решениями. Кроме того, запуск команд с использованием --trusted-host может помочь вам в случае с временными трудностями, связанными с SSL-сертификатами.

Если ни один из представленных методов не помог, рекомендуем изучить настройки прокси-сервера или обратиться к системным администраторам вашей сети для получения помощи с настройкой SSL и сертификатов.

Оцените материал
Добавить комментарий

Капча загружается...