2013-10-15 4 views
26

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

Но если мы попытаемся использовать 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 

Версия: пип 1.4.1

ответ

31

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

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

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

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

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

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

+1 --cert аргумент не работает для меня, но конфигурационный файл решения сделал (OS X, установка анаконда) –

+2

Попробуйте это: http://stackoverflow.com/a/28724886/41957 – chnrxn

19

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

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

Я положил это в /etc/pip.conf (сертификат был /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem), и теперь он работает для всех пользователей – Calimo

4

Я использую:

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

pip install pep8 

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

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

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

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

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

+0

Почему 'pip install pep8' нужна линия? – guettli

+0

Это всего лишь пример, я взял его из другого ответа – arjenve

+0

О, извините, что было поздно в пятницу. Время на выходные :-) – guettli

1

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

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

UPDATE

Даже лучшим решением, чем мой первый обходной путь устанавливает сертификат на систему первой (для меня на убунту это будет)

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 и КРТ моего КОРПОРАТИВНЫЕ в (просто сцепляются как файлы). А затем экспортировать переменную (положить, что на мой .bashrc), как это:

export PIP_CERT=/my/path/to/the/bundle.crt 
Смежные вопросы