Validieren Sie SSL-Zertifikate mit Python
Muss ich ein Skript schreiben, das eine Verbindung zu einer Reihe von Websites, die auf unserer Unternehmens-intranet über HTTPS und stellt sicher, dass Ihre SSL-Zertifikate gültig sind; dass Sie noch nicht abgelaufen sind, dass Sie ausgegeben werden für Sie die richtige Adresse, etc. Wir nutzen unsere eigenen internen Unternehmens-Zertifizierungsstelle für diese Seiten, so haben wir den öffentlichen Schlüssel der ZERTIFIZIERUNGSSTELLE zum verifizieren der Zertifikate vor.
Python standardmäßig nur akzeptiert und verwendet SSL-Zertifikate bei der Verwendung von HTTPS, also auch, wenn ein Zertifikat ungültig ist, Python-Bibliotheken wie urllib2 und Verdreht wird nur glücklich, das das Zertifikat verwenden.
gibt es eine gute Bibliothek irgendwo, lassen Sie mich eine Verbindung zu einer Website über HTTPS, und überprüfen Sie das Zertifikat auf diese Weise?
Wie überprüfe ich ein Zertifikat in Python?
InformationsquelleAutor der Frage Eli Courtwright | 2009-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der release-version 2.7.9/3.4.3, Python standardmäßig durchzuführen versucht Zertifikat Validierung.
Dieser hat vorgeschlagen, im PEP-467, das ist Wert, gelesen zu werden: https://www.python.org/dev/peps/pep-0476/
Wirken sich die änderungen auf alle relevanten stdlib Module (das urllib/urllib2, http, httplib).
Relevanten Dokumentationen:
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 Prüfung auf Basis der system bereitgestellten Zertifikat-Datenbank. Im Gegensatz zu diesem, der Anfragen Paket liefert sein eigenes Zertifikat zu bündeln. Vor-und Nachteile der beiden Ansätze diskutiert werden, die Trust-Datenbank - Abschnitt der PEP 476.
InformationsquelleAutor der Antwort Jan-Philip Gehrcke
Habe ich zusätzlich eine Verteilung auf die Python-Package-Index, die macht der
match_hostname()
- Funktion aus Python 3.2ssl
- Paket, das von früheren Versionen von Python.http://pypi.python.org/pypi/backports.ssl_match_hostname/
Können Sie es installieren mit:
Oder machen Sie es sich zu einer Abhängigkeit, die aufgeführt sind in Ihr Projekt
setup.py
. So oder so, es kann z.B. so verwendet werden:InformationsquelleAutor der Antwort Brandon Rhodes
Können Sie Verdreht, um Zertifikate überprüfen. Die wichtigsten API ist CertificateOptionsdie bereitgestellt werden können als die
contextFactory
argument zu diversen Funktionen, wie listenSSL und startTLS.Leider weder Python noch Twisted-kommt mit einem Haufen von CA-Zertifikate benötigt, um tatsächlich tun, HTTPS-überprüfung, noch die HTTPS-überprüfung der Logik. Aufgrund eine Einschränkung in PyOpenSSLman kann es nicht ganz korrekt gerade noch, aber Dank der Tatsache, dass fast alle Zertifikate beinhalten ein Thema, commonName, können Sie nahe genug kommen.
Hier ist ein naives Beispiel-Implementierung einer überprüfung Twisted HTTPS-client ignoriert wildcards und die subjectAltName-Erweiterungen, und verwendet die certificate-authority-Zertifikate präsentieren in der "ca-Zertifikate" - Paket in den meisten Ubuntu-Distributionen. Versuchen Sie es mit Ihrem Lieblings-gültige und ungültige Zertifikat-sites :).
InformationsquelleAutor der Antwort Glyph
PycURL hat das sehr schön.
Unten ein kurzes Beispiel. Es wirft ein
pycurl.error
wenn etwas fischig, wo man ein Tupel mit Fehler-code und eine lesbare Nachricht.Werden Sie wahrscheinlich wollen, konfigurieren Sie weitere Optionen, wie, wo Sie zum speichern der Ergebnisse, etc. Aber keine Notwendigkeit, verunstalteten das Beispiel mit den nicht-essentials.
Beispiel dafür, was Ausnahmen erhoben werden könnten:
Einige links, die ich nützlich gefunden werden die libcurl-docs für setopt und getinfo.
InformationsquelleAutor der Antwort plundra
Hier ein Beispiel-script, welches zeigt, Zertifikat Validierung:
InformationsquelleAutor der Antwort Eli Courtwright
Oder einfach machen Sie Ihr Leben einfacher, indem Sie die Anfragen Bibliothek:
Ein paar mehr Worte über seine Verwendung.
InformationsquelleAutor der Antwort ufo
M2Crypto kann dazu die Validierung. Sie können auch M2Crypto mit Twistedwenn Sie mögen. Die Chandler desktop-client verwendet Twisted-für die Vernetzung und M2Crypto für SSLeinschließlich der Zertifikat Validierung.
Basierend auf Glyphen Kommentar wie es scheint, M2Crypto ist besser-Zertifikat-Verifizierung standardmäßig als das, was Sie tun können, mit pyOpenSSL aktuell, da M2Crypto überprüft, subjectAltName-Feld zu.
Habe ich auch gebloggt, wie die Zertifikate erhalten Mozilla Firefox Schiffe mit Python und nutzbar mit Python SSL-Lösungen.
InformationsquelleAutor der Antwort Heikki Toivonen
Jython FÜHRT certificate verification standardmäßig, so dass die Verwendung von standard-library-Module, z.B. httplib.HTTPSConnection, etc, mit jython werden Zertifikate überprüfen und geben Sie die Ausnahmen für die Ausfälle, d.h. nicht übereinstimmende Identitäten, abgelaufene certs, etc.
In der Tat, Sie haben zu tun, einige zusätzliche Arbeit, um jython, Verhalten sich wie cpython, also um jython NICHT überprüfen, CERT.
Ich geschrieben habe, einen blog-post auf, wie man deaktivieren, überprüfen von Zertifikaten auf jython, da kann es nützlich sein, die in Testphasen, etc.
Installation eines all-Vertrauen-Sicherheit-Anbieter auf java und jython.
http://jython.xhaus.com/installing-an-all-trusting-security-provider-on-java-and-jython/
InformationsquelleAutor der Antwort Alan Kennedy
Ich hatte das gleiche problem, aber wollte, um 3rd-party-Abhängigkeiten (weil dieser one-off-Skript ausgeführt werden, indem viele Benutzer). Meine Lösung war, um wickeln Sie ein
curl
rufen und stellen Sie sicher, dass der exit-code war0
. Arbeitete wie ein Charme.InformationsquelleAutor der Antwort Ztyx
pyOpenSSL ist eine Schnittstelle zur OpenSSL-Bibliothek. Es sollte alles bieten, was Sie brauchen.
InformationsquelleAutor der Antwort DisplacedAussie