Ich arbeite an der Implementierung einer Webanwendung, die eine API verwendet. Während einer Antwort sendet der API-Server eine Verbindung zu einem X509-Zertifikat (im PEM-Format, das aus einem Signaturzertifikat und einem oder mehreren Zwischenzertifikaten für ein Stammzertifizierungsstellenzertifikat besteht), das ich herunterladen und zur weiteren Überprüfung verwenden muss.Wie validiere/verifiziere ich eine X509-Zertifikat-Vertrauenskette in Python?
Bevor das Zertifikat verwendet wird, muss sichergestellt werden, dass alle Zertifikate in der Kette kombiniert werden, um eine Vertrauenskette zu einem vertrauenswürdigen Stammzertifizierungsstellenzertifikat zu erstellen (um böswillige Anforderungen zu erkennen und zu vermeiden). Es fällt mir schwer, dies in Python zu tun, und meine Forschung zu diesem Thema liefert nichts Nützliches.
Das Zertifikat wird leicht ergriffen und geladen und unter Verwendung von Anfragen m2crypto
import requests
from M2Crypto import RSA, X509
mypem = requests.get('https://server.com/my_certificate.pem')
cert = X509.load_cert_string(str(mypem.text), X509.FORMAT_PEM)
Jedoch ist die Zertifikatkette Validieren Problem. Es ist nicht praktikabel für mich, das Zertifikat auf Platte zu schreiben, um ein Kommandozeilen-Dienstprogramm wie openssl
über etwas wie Subprozess zu verwenden, also muss es durch Python gemacht werden. Ich habe auch keine offenen Verbindungen und so funktioniert auch die Verwendung einer verbindungsbasierten Validierungslösung (wie in dieser Antwort/Thread erwähnt: https://stackoverflow.com/a/1088224/4984533) nicht.
auf einem anderen Thread über dieses Problem (bei https://stackoverflow.com/a/4427081) Abt erklärt, dass m2crypto diese Validierung zu tun, nicht in der Lage ist und sagt, dass er eine Verlängerung Validierung zu ermöglichen geschrieben hat (das Modul m2ext
mit), aber seine Patch scheint nie Arbeit, immer wiederkehr falsch, obwohl ich weiß, es ist gültig:
from m2ext import SSL
ctx = SSL.Context()
ctx.load_verify_locations(capath='/etc/ssl/certs/') # I have run c_rehash in this directory to generate a list of cert files with signature based names
if not ctx.validate_certificate(cert): # always happens
print('Invalid certificate!')
es gibt auch diese Antwort auf einem ähnlichen Thread hier https://stackoverflow.com/a/9007764/4984533, in dem John Matthews einen Patch, der es tun wird geschrieben haben behauptet, aber leider ist der Patch Link jetzt tot - und überhaupt gibt es einen Kommentar zu diesem Thread, der besagt, dass der Patch nicht mit openssl 0.9.8e funktioniert hat.
Alle Antworten in Bezug auf die Validierung einer Zertifikatskette des Vertrauens in Python scheinen entweder mit dem toten Patch zu verknüpfen oder gehen Sie zurück zu m2ext
.
Gibt es eine einfache, direkte Möglichkeit, meine Zertifikats-Vertrauenskette in Python zu überprüfen?
Btw pyopenssl openssl hüllt so würde man es nicht über die Befehlszeile verwenden müssen. Auch lesenswert wenn du noch nicht https://www.python.org/dev/peps/pep-0476/ –
Danke für den Link Avi, hatte ich das vorher nicht gesehen. Es hilft mir nicht in meiner gegenwärtigen Zwangslage (es scheint jedoch um HTTP-Clients zu gehen). Ich habe kein Problem mit einem Befehlszeilenprogramm, um die Verifizierung bei Bedarf durchzuführen - aber nicht, wenn ich die pem-Datei bei jeder Anfrage auf Platte schreiben muss. Wenn der Befehl openssl verify stattdessen eine rohe Zeichenkette aufnehmen könnte, könnte ich das verwenden (auch wenn es wie ein hacky Workaround für etwas erscheint, das ich für sicher hielt, wäre in Python trivial). – speznot