Как игнорировать предупреждения безопасности, выдаваемые при установке pip на частный сервер pypi с использованием самозаверяющего сертификата

У меня есть то, что я считаю нишевым сценарием. У меня есть сервер pypi, работающий на сервере Linux. Получение пакетов из него с помощью:

pip install --extra-index-url http://<IP>:8080 MyPackage

Работает, как и следовало ожидать, с пакетом, загружаемым из частного репо.

Однако после введения в уравнение самозаверяющего сертификата (у меня нет домена для этого IP) с помощью следующей команды:

pip install --cert apache-selfsigned.crt --extra-index-url https://UN:PW@<IP>:443 MyPackage

Я получаю следующие ошибки (хотя это все еще работает, как вы можете видеть внизу):


Collecting MyPackage
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
/usr/share/python-wheels/urllib3-1.22-py2.py3-none-any.whl/urllib3/connectionpool.py:860: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Installing collected packages: MyPackage
Successfully installed MyPackage-0.2.0

Я использую Apache2 в качестве обратного прокси-сервера для переадресации порта 443 на порт pypi.

Сертификат «действителен», но, очевидно, не зарегистрирован в ЦС. Он отлично работает для шифрования и для подключения через веб-браузер (как только я приму «риски»). Итак, я знаю, что сертификат/ключ работают правильно.

Кажется крайне неэффективным, чтобы pip пытался 5 раз и потерпел неудачу, прежде чем решить продолжить с непроверенным сертификатом, есть ли что-то не так в сертификате? Или просто зависимости pip не любят самоподписанные сертификаты и всегда будут терпеть неудачу 5 раз, прежде чем признать, что все в порядке.

Из-за extra-index-urlpip выполняет поиск в PyPI, а из-за cert использует его для проверки pypi.org хоста, что явно не удается. В качестве обходного пути вы можете использовать --trusted-host=pypi.org --trusted-host=files.pythonhosted.org, если вам нужно использовать репозиторий через extra-index-url; однако правильным решением IMO будет общесистемная установка надлежащего самозаверяющего сертификата, привязанного к DN. Кроме того, вам не нужно --trusted-host=<IP>, если вы используете --cert.

hoefling 22.05.2019 19:13

Или вы можете полностью игнорировать PyPI и установить все со своего собственного индексного сервера через --index-url=<IP>. Остальное зависит от реализации сервера; либо вам нужно будет разместить все зависимости пакета самостоятельно, либо использовать, например. devpi, который действует как прокси-сервер PyPI (пакеты, недоступные локально, будут загружены из PyPI).

hoefling 22.05.2019 19:24

Спасибо, --trusted-host удален из вопроса, чтобы избежать путаницы, я действительно обнаружил это незадолго до того, как прочитал ваше сообщение во время моих попыток «проб и ошибок» найти решение. Хотел бы я знать о --index-url, короче говоря, это мой ответ, пожалуйста, опубликуйте ответ правильно, поскольку вы решили это для меня.

Single Entity 22.05.2019 19:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
1 337
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При использовании --extra-index-urlpip по-прежнему будет использовать PyPI по вашему дополнительному индексу при поиске пакета. К сожалению, нет возможности указать «дополнительный индексный сертификат», поэтому, когда вы передаете --cert, pip будет использовать сертификат для всех хостов индекса, включая pypi.org. Вот почему вы получаете ошибки certificate verify failed. Чтобы обойти это, вы можете:

  • Установите систему сертификатов широко, чтобы вам вообще не пришлось проходить --cert. Точные шаги зависят от ОС, также вам потребуются дополнительные шаги для виртуальных окружений.
  • Используйте --index-url=<IP> --cert=my.crt — учтите, что в этом случае pip вообще не будет запрашивать PyPI, поэтому вы сможете устанавливать только те пакеты, которые предлагает ваш собственный индекс. Приличные индексные серверы, такие как devpi, могут действовать как прокси для PyPI, так что это не такая большая проблема.
  • Доверяйте хостам PyPI: --extra-index-url=<IP> --cert=my.cert --trusted-host=pypi.org --trusted-host=files.pythonhosted.org — это пропустит проверку хостов PyPI, поэтому небезопасно и должно быть только временным обходным путем.

Другие вопросы по теме