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.
essayer:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
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]>
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
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
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/
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.
Paramétrer export SSL_CERT_FILE=/path/file.crt
devrait faire l'affaire.