Я пытаюсь разобраться, есть ли способ, чтобы мне не пришлось использовать флаг –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
Предыдущая команда автоматически обновляет файл пакета (проверив внизу /etc/ssl/certs/ca-certificates.crt, вы должны теперь увидеть тот же сертификат, что и в my_cert.crt)
Теперь используйте этот путь в PIP_CERT. И добавьте его в мой .bashrc:
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я уже размещал этот ответ в SO (тот же ответ, что и в ‘в конечном итоге дублирующей ссылке выше’, но в начале я не нашел другой (в конечном итоге дублирующий ответ)… так что если кто-то, как я, доберется сюда первым, это может помочь.
Возможно, я нарушаю какие-то правила, размещая один и тот же ответ дважды, один в SO и другой на superuser. Если это так, извините за это.
Это сработало для меня без необходимости знать, где находится конфигурационный файл:
python -m pip config set global.cert C:\\Path\\cert.crt
Я считаю, вам нужна версия pip 10+, которую вы можете найти с помощью:
python -m pip --version
Вывод команды конфигурации затем выводит название конфигурационного файла для вашего удобства
Если вы переходите между средами и вам нужны как оригинальные pip сертификаты, так и сертификаты вашей компании, вы можете объединить их вместе1:
И установите pip для использования этого пакета глобально:
python3 -m pip config set global.cert /usr/local/share/ca-certificates/mycert-pip-bundle.crt
1python3 -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, вот что сработало для меня.
Файл requirements.txt должен содержать все библиотеки, которые вы планируете загрузить, например:
fastapi
uvicorn
typing
Pip использует системное хранилище сертификатов по умолчанию, начиная с версии 24.2. Это должно устранить необходимость передавать --cert ... в корпоративных средах.
Эта функция существует, но не включена по умолчанию, начиная с версии 22.2. В этом случае документация гласит, что необходимо переключить --use-feature=truststore:
pip install SomePackage --use-feature=truststore
Это должно быть возможно настроить этот параметр навсегда, используя
и там упоминалось, что при устранении неполадок они изменили свой 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), добавив в него следующие строки:
Это позволит pip автоматически использовать заданный сертификат при всех установках пакетов, избегая необходимости каждый раз вручную указывать флаг --cert.
2. Переменная окружения PIP_CERT
Если конфигурационный файл по каким-то причинам не работает, вы можете использовать переменную окружения PIP_CERT. Для этого вам нужно выполнить следующую команду в терминале:
После этого не забудьте перезапустить терминал или выполнить команду source ~/.bashrc, чтобы изменения вступили в силу.
3. Установка сертификатов в системное хранилище
Иногда система и приложения не распознают пользовательские сертификаты. Если вы не сделали этого ранее, попробуйте установить свой сертификат в системное хранилище сертификатов:
После выполнения этих команд сертификат будет доступен для всех приложений на вашем компьютере.
4. Использование PIP и системных хранилищ сертификатов
С недавних пор, начиная с версии pip 24.2, была добавлена поддержка системного хранилища сертификатов по умолчанию. Это значит, что вам не нужно будет указывать сертификат каждый раз, если системное хранилище настроено правильно. Вы можете установить флаг по умолчанию:
pip config set global.use-feature truststore
5. Использование --trusted-host
Если у вас по-прежнему возникают проблемы при установке пакетов, вы можете указать pip доверять определённым хостам. Например:
Это временное решение, которое может помочь в ситуациях, когда возникают проблемы с сертификатом.
Заключение
Представленные выше методы позволят вам избежать постоянного указания флага --cert при установке пакетов с помощью pip. Настройка конфигурационного файла и установка сертификатов в системное хранилище являются наиболее эффективными и устойчивыми решениями. Кроме того, запуск команд с использованием --trusted-host может помочь вам в случае с временными трудностями, связанными с SSL-сертификатами.
Если ни один из представленных методов не помог, рекомендуем изучить настройки прокси-сервера или обратиться к системным администраторам вашей сети для получения помощи с настройкой SSL и сертификатов.