Подтвердить что ты не робот

Pip: cert не удалось, но завитки

Мы установили наш корневой сертификат на клиенте, а соединение https работает для curl.

Но если мы попытаемся использовать pip, он терпит неудачу:

Could not fetch URL https://installserver:40443/pypi/simple/pep8/:
There was a problem confirming the ssl certificate: 
<urlopen error [Errno 1] _ssl.c:499: error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed>

Сертификат находится на клиенте. См:

(foo_fm_qti)[email protected]:~$ curl -v https://installserver:40443/pypi/simple/pep8/
* About to connect() to installserver port 40443 (#0)
*   Trying 127.0.0.1... connected
* Connected to installserver (127.0.0.1) port 40443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs/
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS alert, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: C=DE; ST=Sachsen; L=Chemnitz; O=FOO-COM GmbH; OU=DV; CN=gray.foo-com.lan; [email protected]
*    start date: 2013-09-09 10:47:50 GMT
*    expire date: 2019-05-24 10:47:50 GMT
*    subjectAltName: installserver matched
*    issuer: C=DE; ST=Sachsen; L=Chemnitz; O=FOO-COM GmbH; CN=FOO-COM Root CA; [email protected]
*    SSL certificate verify ok.
> GET /pypi/simple/pep8/ HTTP/1.1

Версия: pip 1.4.1

4b9b3361

Ответ 1

К сожалению, pip не использует системные сертификаты, но curl делает.

Я нашел решение:

pip --cert /etc/ssl/certs/FOO_Root_CA.pem install pep8

Это не приятно (завиток и другие библиотеки находят сертификат без добавления параметра), но работают.

Если вы не хотите использовать аргумент командной строки, вы можете установить сертификат в ~/.pip/pip.conf:

[global]
cert = /etc/ssl/certs/Foo_Root_CA.pem

Ответ 2

Мое решение загружает cacert.pem из http://curl.haxx.se/ca/cacert.pem и добавьте путь для cacert.pem к ~/.pip/pip.conf, как предположил геттли

[global]
cert = /path/to/cacert.pem

Ответ 3

Я использую:

export PIP_CERT=`python -m pip._vendor.requests.certs`

pip install pep8

PIP всегда проверяет сертификат HTTPS-соединений (и все пакеты pypi перенаправляются на HTTPS).

Алгоритм определения файла CA основан на трех шагах:

  • Посмотрите список местоположений по умолчанию для разных дистрибутивов Linux (в моем случае этот файл оказался устаревшим, так как я строю очень старый дистрибутив Linux)
  • Если доступно, переопределите значение, найденное в (1), из значения в файле pip.conf, среде или командной строке (в этом порядке),
  • Если оба (1) и (2) не привели к значению, используйте связанный файл

Обратите внимание, что в пипе не используются каталоги и файлы SSL по умолчанию (из ssl.get_default_verify_paths()). Но поддерживает только связанный файл CA.

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

Ответ 4

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

Команда, отправленная @arjenve, тоже не работала в моей системе. Я получаю: /usr/bin/python: No module named _vendor.requests

UPDATE

Еще лучшее решение, чем мое первое решение - сначала установить сертификат в системе (для меня это будет на 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

ПОСЛЕДНИЕ ПРОСМОТРЫ

Мое обходное решение состояло в том, чтобы создать файл пакета из /etc/ssl/certs/ca-certificates.crt и моего корпоративного crt (просто объединить оба файла). А затем экспортируйте переменную (поставьте ее на мой .bashrc) следующим образом:

export PIP_CERT=/my/path/to/the/bundle.crt