pip: cert zawiódł, ale curl działa

Zainstalowaliśmy nasz certyfikat root na kliencie, a połączenie https działa dla curl.

Ale jeśli spróbujemy użyć pip, to się nie uda:

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>

Cert jest na kliencie. Zobacz:

(foo_fm_qti)foo_fm_qti@vis-work:~$ 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

Wersja: pip 1.4.1

Author: guettli, 2013-10-15

4 answers

Niestety pip nie korzysta z systemu Cert, ale curl tak.

Znalazłem rozwiązanie:

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

To nie jest miłe (curl i inne biblioteki znajdują cert bez dodawania parametru), ale działa.

Jeśli nie chcesz używać argumentu wiersza poleceń, możesz ustawić cert w~/.pip/pip.conf:

[global]
cert = /etc/ssl/certs/Foo_Root_CA.pem
 34
Author: guettli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 08:34:38

Moim rozwiązaniem jest pobranie cacert.pem z http://curl.haxx.se/ca/cacert.pem i dodać ścieżkę dla cacert.pem do {[3] } Jak zasugerował guettli

[global]
cert = /path/to/cacert.pem
 21
Author: user2200896,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 00:53:52

Używam:

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

pip install pep8

PIP zawsze sprawdza certyfikat połączeń HTTPS (a wszystkie pakiety pypi przekierowują do HTTPS).

Algorytm określania pliku CA opiera się na 3 krokach:

  1. spójrz na listę domyślnych lokalizacji dla różnych dystrybucji Linuksa ( w moim przypadku ten plik okazał się nieaktualny, ponieważ buduję na bardzo starej dystrybucji Linuksa )
  2. jeśli jest dostępna, nadpisuje wartość znajdującą się w (1) z wartości w pip.conf plik, środowisko lub wiersz poleceń (w tej kolejności),
  3. Jeśli zarówno (1), jak i (2) nie dały wartości, użyj dołączonego pliku

zauważ, że pip nie używa domyślnych katalogów i plików SSL (Z ssl.get_default_verify_paths()). Ale obsługuje tylko dołączony plik CA.

PIP obsługuje akcję wiersza poleceń, aby wyświetlić listę dołączonego pliku z kroku 3 i to jest to, czego używam do tej odpowiedzi.

 4
Author: arjenve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 10:21:55

Dla mnie żadne obejście plików konfiguracyjnych nie zadziałało. Używam pip 1.5.4 na Ubuntu 14.04

Polecenie wysłane przez @ arjenve również nie działało na moim systemie. Otrzymuję: /usr/bin/python: No module named _vendor.requests

UPDATE

[10]} jeszcze lepszym rozwiązaniem niż moje pierwsze obejście jest zainstalowanie certyfikatu w systemie (dla mnie na ubuntu byłoby to)
sudo cp ~/my_cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

Poprzedni automatycznie aktualizuje plik pakietu (sprawdzając na dole /etc/ssl/certs/ca-certificates.crt ty powinien teraz zobaczyć ten sam certyfikat co w my_cert.crt)

Teraz wyeksportuj tę ścieżkę do PIP_CERT i dodaj ją do swojego .bashrc:

echo export PIP_CERT=/etc/ssl/certs/ca-certificates.crt >> ~/.bashrc

STARSZE OBEJŚCIE

Moje obejście polegało na utworzeniu pliku bundle z /etc/ssl/certs/ca-certificates.crt i crt mojej firmy(po prostu połączyłem oba pliki). A następnie wyeksportować zmienną (umieścić ją na moim .bashrc) w ten sposób:

export PIP_CERT=/my/path/to/the/bundle.crt
 1
Author: andzep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 08:15:09