web-dev-qa-db-fra.com

Comment obtenir des demandes Python pour faire confiance à un certificat SSL auto-signé?

import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)

Si l'URL utilise un certificat auto-signé, cela échoue avec 

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Je sais que je peux passer False au paramètre verify, comme ceci:

r = requests.post(url, data=data, verify=False)

Cependant, ce que je voudrais faire est de pointer les requêtes vers une copie de la clé publique sur le disque et de lui dire de faire confiance à ce certificat.

39
Matthew Moisen

essayer:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')
33
krock

Avec le paramètre verify, vous pouvez fournir un ensemble d'autorités de certification personnalisées ( http://docs.python-requests.org/en/latest/user/advanced/ ):

requests.get(url, verify=path_to_bundle)

Vous pouvez passer vérifier le chemin vers un fichier CA_BUNDLE avec des certificats de CA de confiance. Cette liste d'autorités de certification approuvées peut également être spécifiée via la variable d'environnement REQUESTS_CA_BUNDLE.

Vous pouvez également spécifier un certificat local à utiliser comme certificat côté client, en tant que fichier unique (contenant la clé privée et le certificat) ou en tant que tuple du chemin des deux fichiers:

>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
<Response [200]>
30

Le plus simple consiste à exporter la variable REQUESTS_CA_BUNDLE qui pointe vers votre autorité de certification privée ou un ensemble de certificats spécifique. Sur la ligne de commande, vous pouvez le faire comme suit:

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

Si vous avez votre autorité de certification et que vous ne voulez pas taper la export à chaque fois, vous pouvez ajouter le REQUESTS_CA_BUNDLE à votre ~/.bash_profile comme suit:

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile
9
Mike N

Le cas où plusieurs certificats sont nécessaires a été résolu comme suit: Puis définissez les demandes REQUESTS_CA_BUNDLE var sur ce fichier dans mon fichier ./.bash_profile.

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile
2
Halbert Stone

Vous pouvez essayer: 

settings = s.merge_environment_settings(prepped.url, None, None, None, None)

Vous pouvez en lire plus ici: http://docs.python-requests.org/en/master/user/advanced/

0
gan

Si quelqu'un arrive ici (comme je l'ai fait) qui cherche à ajouter une autorité de certification (dans mon cas, Charles Proxy) pour httplib2, il semble que vous puissiez l'ajouter au fichier cacerts.txt inclus avec le paquet python.

Par exemple:

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

Les variables d'environnement référencées dans d'autres solutions semblent être spécifiques aux demandes et n'ont pas été récupérées par httplib2 lors de mes tests.

0
Mat Schaffer

Paramétrer export SSL_CERT_FILE=/path/file.crt devrait faire l'affaire.

0
gizzmole