web-dev-qa-db-fra.com

pip: cert a échoué, mais curl fonctionne

Nous avons installé notre certificat racine sur le client et la connexion https fonctionne pour curl.

Mais si nous essayons d'utiliser pip, cela échoue:

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>

Le certificat est sur le client. Voir:

(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

Version: pip 1.4.1

30
guettli

Malheureusement, pip n'utilise pas les certificats système, mais curl le fait.

J'ai trouvé une solution:

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

Ce n'est pas sympa (curl et les autres bibliothèques trouvent le cert sans ajouter de paramètre) mais ça marche.

Si vous ne souhaitez pas utiliser l'argument de ligne de commande, vous pouvez définir le certificat dans ~/.pip/pip.conf:

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

Ma solution télécharge cacert.pem de http://curl.haxx.se/ca/cacert.pem et ajoutez le chemin pour cacert.pem à ~/.pip/pip.conf comme l'a suggéré guettli

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

J'utilise:

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

pip install pep8

PIP valide toujours le certificat des connexions HTTPS (et tous les packages pypi sont redirigés vers HTTPS).

L'algorithme de détermination du fichier CA est basé sur 3 étapes:

  1. Regardez dans une liste d'emplacements par défaut pour différentes distributions linux (dans mon cas, ce fichier s'est avéré être obsolète, car je m'appuie sur une très vieille distribution linux)
  2. Si disponible, remplacez la valeur trouvée dans (1) par une valeur du fichier pip.conf, de l'environnement ou de la ligne de commande (dans cet ordre),
  3. Si (1) et (2) n'ont pas abouti à une valeur, utilisez un fichier groupé

Notez que pip n'utilise pas les répertoires et fichiers SSL par défaut (de ssl.get_default_verify_paths ()). Mais ne prend en charge qu'un fichier CA groupé.

PIP prend en charge une action en ligne de commande pour répertorier le fichier fourni à l'étape 3 et c'est ce que j'utilise pour cette réponse.

4
arjenve

Pour moi, aucune des solutions de contournement du fichier de configuration n'a fonctionné. J'utilise pip 1.5.4 on buntu 14.04

La commande publiée par @arjenve ne fonctionnait pas non plus sur mon système. Je reçois: /usr/bin/python: No module named _vendor.requests

MISE À JOUR

Une solution encore meilleure que ma première solution consiste à installer le certificat sur le système en premier (pour moi sur Ubuntu, ce serait)

Sudo cp ~/my_cert.crt /usr/local/share/ca-certificates/
Sudo update-ca-certificates

Le précédent met automatiquement à jour le fichier de l'ensemble (vérification en bas de /etc/ssl/certs/ca-certificates.crt vous devriez maintenant voir le même certificat que dans my_cert.crt)

Maintenant, exportez ce chemin dans PIP_CERT et ajoutez-le à votre .bashrc:

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

CONTOURNEMENT ANCIEN

Ma solution de contournement consistait à créer un fichier de bundle à partir de /etc/ssl/certs/ca-certificates.crt et le crt de mon entreprise (juste concaténé les deux fichiers). Et puis exportez une variable (mettez-la sur mon .bashrc) comme ça:

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