У меня есть то, что я считаю нишевым сценарием. У меня есть сервер 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 раз, прежде чем признать, что все в порядке.
Или вы можете полностью игнорировать PyPI и установить все со своего собственного индексного сервера через --index-url=<IP>
. Остальное зависит от реализации сервера; либо вам нужно будет разместить все зависимости пакета самостоятельно, либо использовать, например. devpi
, который действует как прокси-сервер PyPI (пакеты, недоступные локально, будут загружены из PyPI).
Спасибо, --trusted-host удален из вопроса, чтобы избежать путаницы, я действительно обнаружил это незадолго до того, как прочитал ваше сообщение во время моих попыток «проб и ошибок» найти решение. Хотел бы я знать о --index-url, короче говоря, это мой ответ, пожалуйста, опубликуйте ответ правильно, поскольку вы решили это для меня.
При использовании --extra-index-url
pip
по-прежнему будет использовать PyPI по вашему дополнительному индексу при поиске пакета. К сожалению, нет возможности указать «дополнительный индексный сертификат», поэтому, когда вы передаете --cert
, pip
будет использовать сертификат для всех хостов индекса, включая pypi.org
. Вот почему вы получаете ошибки certificate verify failed
. Чтобы обойти это, вы можете:
--cert
. Точные шаги зависят от ОС, также вам потребуются дополнительные шаги для виртуальных окружений.--index-url=<IP> --cert=my.crt
— учтите, что в этом случае pip
вообще не будет запрашивать PyPI, поэтому вы сможете устанавливать только те пакеты, которые предлагает ваш собственный индекс. Приличные индексные серверы, такие как devpi
, могут действовать как прокси для PyPI, так что это не такая большая проблема.--extra-index-url=<IP> --cert=my.cert --trusted-host=pypi.org --trusted-host=files.pythonhosted.org
— это пропустит проверку хостов PyPI, поэтому небезопасно и должно быть только временным обходным путем.
Из-за
extra-index-url
pip
выполняет поиск в PyPI, а из-заcert
использует его для проверкиpypi.org
хоста, что явно не удается. В качестве обходного пути вы можете использовать--trusted-host=pypi.org --trusted-host=files.pythonhosted.org
, если вам нужно использовать репозиторий черезextra-index-url
; однако правильным решением IMO будет общесистемная установка надлежащего самозаверяющего сертификата, привязанного к DN. Кроме того, вам не нужно--trusted-host=<IP>
, если вы используете--cert
.