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.
versuchen:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
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]>
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
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
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/
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.
Die Einstellung von export SSL_CERT_FILE=/path/file.crt
sollte den Job erledigen.