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
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
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
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:
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.
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