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
den verify
Parameter wie folgt übergeben kann:
r = requests.post(url, data=data, verify=False)
Ich möchte jedoch Anfragen auf eine Kopie des öffentlichen Schlüssels auf der Festplatte verweisen und ihm mitteilen, dass er diesem Zertifikat vertrauen soll.
python
ssl
python-requests
Matthew Moisen
quelle
quelle
Antworten:
Versuchen:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
quelle
ssl.get_server_certificate
ein Zertifikat für heruntergeladen(self-signed.badssl.com, 443)
, dieses Zertifikat gespeichertcert.pem
und dann ausgeführt,requests.get('https://self-signed.badssl.com/', verify='cert.pem')
und es ist immer noch mit einem SSL-Fehler fehlgeschlagen (dieses Zertifikat ist selbst signiert).Mit dem
verify
Parameter können Sie ein benutzerdefiniertes Zertifikatberechtigungspaket bereitstellenAus den Dokumenten :
quelle
cert=(...)
ist nur für Client - SSL , auch bekannt als MTLS. Es ist zwar interessant, aber viel seltener und nicht wirklich das, worum es bei der Frage ging.Am einfachsten ist es, die Variable zu exportieren, die
REQUESTS_CA_BUNDLE
auf Ihre private Zertifizierungsstelle oder ein bestimmtes Zertifikatspaket verweist. In der Befehlszeile können Sie dies wie folgt tun:Wenn Sie über Ihre Zertifizierungsstelle verfügen und diese nicht
export
jedes Mal eingeben möchten, könnenREQUESTS_CA_BUNDLE
Sie sie~/.bash_profile
wie folgt zu Ihrer hinzufügen :echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile
quelle
Der Fall, dass 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
quelle
Einstellung
export SSL_CERT_FILE=/path/file.crt
sollte den Job machen.quelle
REQUESTS_CA_BUNDLE
Variable in meinem Fall keine Auswirkung hat).Wenn jemand hier landet (wie ich), der eine Zertifizierungsstelle (in meinem Fall Charles Proxy) für httplib2 hinzufügen möchte, können Sie diese anscheinend an die
cacerts.txt
Datei anhängen, die im Python-Paket enthalten ist.Zum Beispiel:
Die Umgebungsvariablen, auf die in anderen Lösungen verwiesen wird, scheinen anforderungsspezifisch zu sein und wurden in meinen Tests nicht von httplib2 erfasst.
quelle
Sie können versuchen:
settings = s.merge_environment_settings(prepped.url, None, None, None, None)
Weitere Informationen finden Sie hier: http://docs.python-requests.org/en/master/user/advanced/
quelle