Ich muss ein Skript schreiben, das über HTTPS eine Verbindung zu einer Reihe von Websites in unserem Unternehmensintranet herstellt und überprüft, ob deren SSL-Zertifikate gültig sind. dass sie nicht abgelaufen sind, dass sie für die richtige Adresse ausgestellt wurden usw. Wir verwenden für diese Websites unsere eigene interne Unternehmenszertifizierungsstelle, sodass wir über den öffentlichen Schlüssel der Zertifizierungsstelle verfügen, um die Zertifikate zu überprüfen.
Python akzeptiert und verwendet standardmäßig nur SSL-Zertifikate, wenn HTTPS verwendet wird. Selbst wenn ein Zertifikat ungültig ist, verwenden Python-Bibliotheken wie urllib2 und Twisted das Zertifikat nur gerne.
Gibt es irgendwo eine gute Bibliothek, mit der ich über HTTPS eine Verbindung zu einer Site herstellen und deren Zertifikat auf diese Weise überprüfen kann?
Wie überprüfe ich ein Zertifikat in Python?
quelle
treq
odertwisted.web.client.Agent
seit Version 14.0 verwenden, überprüft Twisted standardmäßig Zertifikate.Antworten:
Ab Release 2.7.9 / 3.4.3 versucht Python standardmäßig , eine Zertifikatüberprüfung durchzuführen.
Dies wurde in PEP 467 vorgeschlagen, das eine Lektüre wert ist: https://www.python.org/dev/peps/pep-0476/
Die Änderungen betreffen alle relevanten stdlib-Module (urllib / urllib2, http, httplib).
Relevante Dokumentation:
https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection
https://docs.python.org/3/library/http.client.html#http.client.HTTPSConnection
Beachten Sie, dass die neue integrierte Überprüfung auf der vom System bereitgestellten Zertifikatdatenbank basiert . Im Gegensatz dazu liefert das Anforderungspaket ein eigenes Zertifikatspaket. Vor- und Nachteile beider Ansätze werden im Abschnitt Vertrauensdatenbank von PEP 476 erörtert .
quelle
HTTPSConnection
Unterricht zu benutzen ? Ich habe benutztSSLSocket
. Wie kann ich eine Validierung durchführenSSLSocket
? Muss ich die Verwendungpyopenssl
wie hier erläutert explizit validieren ?Ich habe dem Python-Paketindex eine Distribution hinzugefügt, die die
match_hostname()
Funktion aus dem Python 3.2-ssl
Paket in früheren Versionen von Python verfügbar macht .http://pypi.python.org/pypi/backports.ssl_match_hostname/
Sie können es installieren mit:
Oder Sie können es zu einer Abhängigkeit machen, die in Ihrem Projekt aufgeführt ist
setup.py
. In beiden Fällen kann es folgendermaßen verwendet werden:quelle
getpeercert()
Methode aufrufen muss, damit die Ausgabe übergeben werden kannmatch_hostname()
.Mit Twisted können Sie Zertifikate überprüfen. Die Haupt-API ist CertificateOptions , die als
contextFactory
Argument für verschiedene Funktionen wie listenSSL und startTLS bereitgestellt werden kann .Leider werden weder Python noch Twisted mit dem Stapel von CA-Zertifikaten geliefert, die für die eigentliche HTTPS-Validierung erforderlich sind, noch mit der HTTPS-Validierungslogik. Aufgrund einer Einschränkung in PyOpenSSL können Sie dies noch nicht vollständig korrekt ausführen. Dank der Tatsache, dass fast alle Zertifikate einen Betreff commonName enthalten, können Sie jedoch nahe genug heranrücken.
Hier ist eine naive Beispielimplementierung eines verifizierenden Twisted HTTPS-Clients, der Platzhalter und subjectAltName-Erweiterungen ignoriert und die Zertifizierungsstellenzertifikate verwendet, die im Paket 'ca-certificates' in den meisten Ubuntu-Distributionen enthalten sind. Versuchen Sie es mit Ihren bevorzugten gültigen und ungültigen Zertifikatseiten :).
quelle
URLPath(url).netloc
Folgendes: Dies bedeutet, dass der Host-Teil der URL an SecureGet übergeben wird. Mit anderen Worten, es wird überprüft, ob der gemeinsame Name des Betreffs mit dem vom Anrufer angeforderten übereinstimmt.https://www.google.com/
wird abgelehnt, da einer der Betreffs "www.google.com" ist und die Funktion "False" zurückgibt. Es bedeutete wahrscheinlich, True (akzeptiert) zurückzugeben, wenn die Namen übereinstimmen, und False, wenn sie nicht übereinstimmen?PycURL macht das wunderbar.
Unten ist ein kurzes Beispiel. Es wird ein werfen ,
pycurl.error
wenn etwas faul ist, wo Sie ein Tupel mit dem Fehlercode und einer für Menschen lesbaren Nachricht erhalten.Möglicherweise möchten Sie weitere Optionen konfigurieren, z. B. wo die Ergebnisse gespeichert werden sollen usw. Sie müssen das Beispiel jedoch nicht mit nicht wesentlichen Elementen überladen.
Beispiel für mögliche Ausnahmen:
Einige Links, die ich nützlich fand, sind die libcurl-docs für setopt und getinfo.
quelle
Oder erleichtern Sie einfach Ihr Leben, indem Sie die Anforderungsbibliothek verwenden:
Noch ein paar Worte zu seiner Verwendung.
quelle
cert
Argument ist das clientseitige Zertifikat, kein Serverzertifikat, gegen das geprüft werden muss. Sie möchten dasverify
Argument verwenden.verify
Argument muss nicht verwendet werden, außer um expliziter zu sein oder die Überprüfung zu deaktivieren.Hier ist ein Beispielskript, das die Zertifikatvalidierung demonstriert:
quelle
CertValidatingHTTPSConnection.connect
. Weitere Informationen (und eine Korrektur) finden Sie in dieser Pull-Anfrage .backports.ssl_match_hostname
.M2Crypto kann die Validierung durchführen . Sie können M2Crypto auch mit Twisted verwenden, wenn Sie möchten . Der Chandler-Desktop-Client verwendet Twisted für das Netzwerk und M2Crypto für SSL , einschließlich der Zertifikatsüberprüfung.
Basierend auf dem Glyphenkommentar scheint M2Crypto standardmäßig eine bessere Zertifikatsüberprüfung durchzuführen als das, was Sie derzeit mit pyOpenSSL tun können, da M2Crypto auch das Feld subjectAltName überprüft.
Ich habe auch darüber gebloggt, wie man die Zertifikate erhält, mit denen Mozilla Firefox in Python ausgeliefert und mit Python-SSL-Lösungen verwendet werden kann.
quelle
Jython führt standardmäßig eine Zertifikatsüberprüfung durch. Wenn Sie also Standardbibliotheksmodule wie z. B. httplib.HTTPSConnection usw. mit jython verwenden, werden Zertifikate überprüft und Ausnahmen für Fehler, dh nicht übereinstimmende Identitäten, abgelaufene Zertifikate usw., angegeben.
Tatsächlich müssen Sie einige zusätzliche Arbeiten ausführen, damit sich jython wie cpython verhält, dh damit jython KEINE Zertifikate überprüft.
Ich habe einen Blog-Beitrag darüber geschrieben, wie die Zertifikatsprüfung in Jython deaktiviert wird, da dies in Testphasen usw. hilfreich sein kann.
Installieren eines vertrauenswürdigen Sicherheitsanbieters unter Java und Jython.
http://jython.xhaus.com/installing-an-all-trusting-security-provider-on-java-and-jython/
quelle
Mit dem folgenden Code können Sie von allen SSL-Validierungsprüfungen profitieren (z. B. Datumsgültigkeit, CA-Zertifikatkette ...), AUSSER einem steckbaren Überprüfungsschritt, z. B. um den Hostnamen zu überprüfen oder andere zusätzliche Schritte zur Zertifikatsüberprüfung durchzuführen.
quelle
pyOpenSSL ist eine Schnittstelle zur OpenSSL-Bibliothek. Es sollte alles bieten, was Sie brauchen.
quelle
Ich hatte das gleiche Problem, wollte aber die Abhängigkeiten von Drittanbietern minimieren (da dieses einmalige Skript von vielen Benutzern ausgeführt werden sollte). Meine Lösung bestand darin, einen
curl
Anruf zu beenden und sicherzustellen, dass der Exit-Code war0
. Lief wie am Schnürchen.quelle