Dies ähnelt der Antwort von @ rafael-almeida, aber ich möchte darauf hinweisen, dass ab Anforderung 2.11+ nicht 3 Werte angenommen werden verify
können , sondern tatsächlich 4:
True
: Überprüft anhand der internen vertrauenswürdigen Zertifizierungsstellen der Anforderungen.
False
: umgeht die Zertifikatvalidierung vollständig . (Nicht empfohlen)
- Pfad zu einer CA_BUNDLE-Datei. Anfragen verwenden dies, um die Zertifikate des Servers zu validieren.
- Pfad zu einem Verzeichnis mit öffentlichen Zertifikatdateien. Anfragen verwenden dies, um die Zertifikate des Servers zu validieren.
Der Rest meiner Antwort bezieht sich auf # 4, wie man ein Verzeichnis mit Zertifikaten zur Validierung verwendet:
Besorgen Sie sich die benötigten öffentlichen Zertifikate und legen Sie sie in einem Verzeichnis ab.
Genau genommen sollten Sie wahrscheinlich eine Out-of-Band-Methode verwenden, um die Zertifikate zu erhalten, aber Sie können sie auch einfach mit einem beliebigen Browser herunterladen.
Wenn der Server eine Zertifikatkette verwendet, stellen Sie sicher, dass Sie jedes einzelne Zertifikat in der Kette erhalten.
Gemäß der Anforderungsdokumentation muss das Verzeichnis mit den Zertifikaten zuerst mit dem Dienstprogramm "rehash" ( openssl rehash
) verarbeitet werden.
(Dies erfordert openssl 1.1.1+ und nicht alle Windows openssl-Implementierungen unterstützen Rehash. Wenn openssl rehash
dies für Sie nicht funktioniert, können Sie versuchen, das Rehash-Ruby-Skript unter https://github.com/ruby/openssl/blob/master auszuführen /sample/c_rehash.rb , obwohl ich das nicht ausprobiert habe.)
Ich hatte einige Probleme damit, Anfragen zum Erkennen meiner Zertifikate zu erhalten, aber nachdem ich den openssl x509 -outform PEM
Befehl zum Konvertieren der Zertifikate in Base64 verwendet hatte.pem
Format verwendet hatte, funktionierte alles einwandfrei.
Sie können auch einfach faul aufwärmen:
try:
# As long as the certificates in the certs directory are in the OS's certificate store, `verify=True` is fine.
return requests.get(url, auth=auth, verify=True)
except requests.exceptions.SSLError:
subprocess.run(f"openssl rehash -compat -v my_certs_dir", shell=True, check=True)
return requests.get(url, auth=auth, verify="my_certs_dir")