2009-10-05 3 views
8

Ich habe versucht, herauszufinden, wie ich ein selbstsigniertes Zertifikat von einem Server in Python überprüfen kann. Ich konnte in Google nicht viele Daten finden. Ich möchte auch sicherstellen, dass die Server-URLÜberprüfen von Peer in SSL mit Python

Vielen Dank im Voraus für alle Einblicke.

Antwort

10

Aus den Kommentaren zu meiner ersten Antwort sehe ich, dass es ein allgemeines Missverständnis gibt, was "ein Zertifikat bedeuten bedeutet". Ich werde versuchen, hier eine kurze Erklärung zu schreiben, um einige der Illusionen zu beseitigen.

Bei der Zertifikatsprüfung wird eine Signatur der Metadaten des Zertifikats (d. H. Betreff, Gültigkeitszeitraum, Erweiterungen usw.) auf eine kryptografische Signatur überprüft. Wenn Sie für die Validierung nur ein selbstsigniertes Zertifikat haben, können Sie es nicht von einem anderen selbstsignierten Zertifikat mit genau denselben Metadaten unterscheiden, sondern von einem anderen Schlüssel, es sei denn, Sie kennen den Schlüssel des Schlüsselzertifikats im Voraus. Und vergessen Sie nicht, dass Sie alle diese Verifizierungsprozedur einrichten, um die Anforderung zu entfernen, dieses Wissen im Voraus zu haben. Durch die regelmäßige Überprüfung von Zertifikaten können Sie die Voraussetzungen für die Nutzung von vorinstalliertem Know-how, das aus Zertifikaten von Drittanbietern, auch "CA-Zertifikate" genannt, besteht, nicht vollständig beseitigen. Da dieses Wissen vorab geteilt wird, können diese Zertifikate selbst signiert sein, aber denken Sie daran, dass Sie Informationen über die Gültigkeit dieser Zertifikate erhalten haben, die nicht aus dem Verifizierungsprozess, sondern aus etwas äußerem Wissen stammen. Wenn Sie über eine Reihe vertrauenswürdiger CA-Zertifikate verfügen, die zwischen Peers verteilt werden, können Sie diese verwenden, um andere Zertifikate zu signieren und Signaturen anhand des vorinstallierten Wissens vertrauenswürdiger Zertifizierungsstellen zu prüfen.

Wenn Sie jedoch keine zusätzlichen Kenntnisse über ein selbstsigniertes Zertifikat mit Ausnahme des Zertifikats selbst haben, können Sie keine Annahmen über das Vertrauen in dieses Zertifikat machen, da es sowohl von bösartigen Hackern als auch von vertrauenswürdigen Servern ausgegeben werden kann.

Bitte erwerben Sie einige Kenntnisse über Man in the middle attack, Public key infrastructure und Public key cryptography im Allgemeinen, bevor Sie irgendeine Art von Zertifikatsverifizierungsprozeduren implementieren.

Bitte haben Sie Verständnis, dass die blinde Verifizierung eines selbstsignierten Zertifikats Sie selbst vor einem cleveren Hacker in Ihrem eigenen Netzwerk nicht schützt, auch wenn Sie die Internetsicherheit im Allgemeinen nicht berücksichtigen.

Bearbeiten: Frage Autor stellte klar, dass er tatsächlich suchte nach einer Verisign (oder anderen CA) Signatur auf einem Zertifikat mit M2Crypto-Bindungen zu überprüfen. Hier sind zwei Beispiele:

from M2Crypto import X509, SSL 

# manual validation of a signature on a certificate using a given CA cert: 
ca = X509.load_cert('/path/to/ca_cert.pem') 
cert = X509.load_cert('certificate_to_validate.pem') 
print "Verification results:", cert.verify(ca.get_pubkey()) 

# adding a given CA cert to the SSL Context for verification 
ctx = SSL.Context() 
# load a certificate from file 
ctx.load_verify_locations(cafile='/path/to/ca_cert.pem') 
# or use all certificate in a CA directory 
ctx.load_verify_locations(capath='/path/to/ca/dir') 
# or you can specify both options at the same time. 

Wenn Sie ein Verzeichnis mit vielen CA-Zertifikate verwenden werden (die oft bequemer ist) müssen Sie jedes Zertifikat <hash>.0 umbenennen wo <hash> der Hash-Wert des Zertifikats unterliegt (erhalten mit openssl x509 -noout -hash -in cert.pem).

+0

Sorry, meine Frage war falsch. – Bhargava

+0

Ich war tatsächlich auf der Suche nach einer Verisign-signierten Zertifikatsverifizierung mit M2Crypto. – Bhargava

+0

Ich habe die Antwort mit M2Crypto-Beispielen aktualisiert. – abbot

0

Es ist nicht möglich, ein selbstsigniertes Zertifikat zu verifizieren, da es sehr eigen ist: Es ist selbstsigniert.

Sie müssen ein Zertifikat durch ein Zertifikat eines anderen vertrauenswürdigen Drittanbieters signieren, um alles überprüfen zu können. Anschließend können Sie das Zertifikat dieses Drittanbieters der Liste Ihrer vertrauenswürdigen Zertifizierungsstellen hinzufügen und anschließend Zertifikate überprüfen von diesem Zertifikat/CA signiert.

Wenn Sie Empfehlungen dazu in Python benötigen, sollten Sie den Namen der von Ihnen verwendeten SSL-Bibliothek angeben, da es eine Auswahl an SSL-Bibliotheken für Python gibt.

+0

Alle CA-Zertifikate der obersten Ebene sind selbstsigniert und es gibt kein Problem, sie zu überprüfen (zu vertrauen). –

+0

natürlich können Sie ein selbstsigniertes Zertifikat verifizieren, Sie müssen nur das Zertifikat lokal kopiert haben. Es ist im Grunde genommen eine öffentliche/private Schlüsselauthentifizierung an diesem Punkt. Viele lokale Authentifizierungssysteme funktionieren auf diese Weise und stellen sicher, dass der Host mit dem x.509-Zertifikat legitimiert ist. Sehen Sie sich certmaster und func für Python-Beispiele an. – JimB

2

Ich nehme an, Sie verwenden eine OpenSSL-Bindung. Ich sehe 2 Möglichkeiten, um dein Problem zu lösen.

  1. Sie können Ihr Zertifikat zum Verzeichnis openssl hinzufügen (führen Sie openssl version -d, um es für Ihr System zu sehen). Dies betrifft alle Programme, die openssl auf Ihrem Computer verwenden.
  2. Zertifikat laden und fügen Sie es zur Laufzeit (der Code Skizze unten ist für pyopenssl, aber es sollte für andere Bindungen ähnlich sein):

.

x509 = OpenSSL.crypto.load_certificate(...) 
ctx = OpenSSL.SSL.Context(...) 
store = ctx.get_cert_store() 
store.add_cert(x509) 
ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, ...) 
+0

Mit diesem Code verifizieren Sie das selbstsignierte Zertifikat nicht, Sie fügen es explizit einem vertrauenswürdigen Zertifikatspeicher hinzu, damit es sich selbst verifiziert. Das Hinzufügen des Zertifikats zum openssl-Verzeichnis funktioniert genauso. Es ist wiederum nicht möglich, ein selbstsigniertes Zertifikat zu verifizieren: jedes selbstsignierte Zertifikat besteht Ihren Verifizierungstest. – abbot

Verwandte Themen