web-dev-qa-db-de.com

Wie erhalte ich, dass Python-Anfragen einem selbst signierten SSL-Zertifikat vertrauen

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

Wenn die URL ein selbstsigniertes Zertifikat verwendet, schlägt dies mit fehl 

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

Ich weiß, dass ich False wie folgt an den Parameter verify übergeben kann:

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

Was ich jedoch tun möchte, ist, Anfragen an eine Kopie des öffentlichen Schlüssels auf der Festplatte zu richten und ihm zu sagen, diesem Zertifikat zu vertrauen.

39
Matthew Moisen

versuchen:

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

Mit dem Parameter verify können Sie ein benutzerdefiniertes Zertifizierungsstellenpaket bereitstellen ( http://docs.python-requests.org/de/latest/user/advanced/ ):

requests.get(url, verify=path_to_bundle)

Sie können den Pfad an eine CA_BUNDLE-Datei mit Zertifikaten von .__ übergeben. vertrauenswürdige Zertifizierungsstellen Diese Liste vertrauenswürdiger Zertifizierungsstellen kann auch über .__ angegeben werden. die Umgebungsvariable REQUESTS_CA_BUNDLE.

Sie können auch ein lokales Zertifikat angeben, das als clientseitiges Zertifikat verwendet werden soll als einzelne Datei (mit dem privaten Schlüssel und dem Zertifikat) oder als Tupel beider Dateipfade:

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

Am einfachsten exportieren Sie die Variable REQUESTS_CA_BUNDLE, die auf Ihre private Zertifizierungsstelle oder ein bestimmtes Zertifikatspaket verweist. In der Befehlszeile können Sie das wie folgt tun:

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

Wenn Sie über eine Zertifizierungsstelle verfügen und nicht jedes Mal export eingeben möchten, können Sie REQUESTS_CA_BUNDLE wie folgt zu Ihrem ~/.bash_profile hinzufügen:

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

Der Fall, in dem mehrere Zertifikate benötigt werden, wurde wie folgt gelöst: Verketten Sie die mehreren Root-Pem-Dateien myCert-A-Root.pem und myCert-B-Root.pem zu einer Datei. Setzen Sie dann die Anforderungen REQUESTS_CA_BUNDLE var auf diese Datei in meinem ./.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

Sie können versuchen: 

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

Sie können mehr hier lesen: http://docs.python-requests.org/de/master/user/advanced/

0
gan

Falls irgendjemand hier landet (wie ich), der sucht, um eine Zertifizierungsstelle (in meinem Fall Charles Proxy) für httplib2 hinzuzufügen, kann es anscheinend an die cacerts.txt-Datei angehängt werden, die im Python-Paket enthalten ist.

Zum Beispiel:

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

Die Umgebungsvariablen, auf die in anderen Lösungen verwiesen wird, scheinen anforderungsspezifisch zu sein und wurden von httplib2 in meinen Tests nicht berücksichtigt.

0
Mat Schaffer

Die Einstellung von export SSL_CERT_FILE=/path/file.crt sollte den Job erledigen.

0
gizzmole