Ich habe comp.lang.python aufgerufen, um zu sehen, ob jemand irgendwelche Ideen zu diesem Problem hatte. Ich habe keine Antwort auf der Mailingliste erhalten, also habe ich beschlossen, hier zu sprechen.Python M2Crypto.SSL.Checker.NoCertificate Ausnahme
Ich habe eine seltsame Eigenart mit dem M2Crypto-Modul und ich hoffe, dass jemand in der Lage sein würde, mir in die richtige Richtung zu zeigen. Ich arbeite mit einem Kollegen zusammen, um ein internes Tool zu entwickeln, um SSL-Zertifikate auf einer Liste von IPv4-Adressen zu prüfen, die über die Standardeingabe erhalten wurden.
Wir verwenden M2Crypto, um bei der Validierung der Zertifikate zu helfen. Wenn wir nur eine IPv4-Adresse überprüfen, kann es uns das korrekte Zertifikat liefern, und wir können unsere Validierungsprüfungen für die Informationen durchführen, die das SSL-Zertifikat enthält.
Wenn wir jedoch versuchen, mehrere IPv4-Adressen zu überprüfen, erhalten wir das "M2Crypto.SSL.Checker.NoCertificate". Es gibt einige Fälle, in denen wir dies erhalten sollten. Ungeachtet dessen, was die zweite oder dritte IPv4-Adresse ist (auch wenn sie als erste gut getestet wurde), wird sie fehlschlagen.
Context Schaffung:
global context
context = M2Crypto.SSL.Context()
if sys.platform.startswith('linux'):
context.load_verify_info(capath="/etc/ssl/certs/")
elif sys.platform.startswith('darwin'):
context.load_verify_info(cafile=certfile)
else:
print "Unknown platform, bail!"
exit(1)
context.set_allow_unknown_ca(True)
context.set_verify(M2Crypto.SSL.verify_none,9)
Sockel Erstellung:
conn = M2Crypto.SSL.Connection(context)
socket.setdefaulttimeout(2.0)
conn.set_socket_read_timeout(M2Crypto.SSL.timeout(sec=2))
conn.set_socket_write_timeout(M2Crypto.SSL.timeout(sec=2))
try:
conn.connect((ip,443))
# we can the catch the exception here, but it shouldn't be failing
Die obigen zwei Codeabschnitte existieren, in ihre eigenen Funktionen. Die Kontexterstellung wird nur einmal aufgerufen, da der Kontext global für alle Verbindungen verwendet wird. Ich dachte zuerst, dass dies das Problem gewesen sein könnte und versuchte dann, den Kontext in jeder Schleife ohne Änderung zu erstellen.
Der letzte Block wird als Teil der Schleife über das Adressfeld aufgerufen. Die IP wird vom Anrufer übergeben.
-Tim
Es ist das Zertifikat von einem Webserver auf einem anderen System gehostet ziehen. Es verwendet die '.pem'-Dateien in/etc/ssl/certs, um zu ermitteln, welche CAs vertrauenswürdig sind, und diese dann zu validieren. Es gibt mehrere .pem-Dateien in '/ etc/ssl/certs' auf Debian-basierten Distributionen. Dasselbe Problem tritt auch bei einem Mac OS X-System auf, das eine einzelne Datei verwendet, die von Mozillas vertrauenswürdigen Zertifizierungsstellen generiert wurde. – theckman
Python ssl-Bibliothek ist auf OpenSSL gebaut. Versuchen Sie, die Zertifikate manuell zu überprüfen, um zu bestätigen, dass der Zertifikatspeicher ordnungsgemäß konfiguriert ist. Das korrekte Funktionieren von/etc/ssl/certs kann eine Herausforderung darstellen. Sie können Zertifikate mit "OpenSSL verify" überprüfen. http://www.madboa.com/geek/openssl/#verify-standard – user590028
Der Zertifikatspeicher ist hier nicht das Problem. Wenn wir eine IP-Adresse überprüfen, wird sie ordnungsgemäß überprüft. Es verbindet und unsere Validierungsprüfungen funktionieren. Beim Versuch, eine Verbindung herzustellen, um das Cert von nachfolgenden Hosts zu erhalten, erhalten wir eine NoCertificate-Ausnahme. Das führt zu der Annahme, dass es während des Verbindungsvorgangs kein Zertifikat vom Server empfängt. OpenSSL überprüft außerdem, ob der Speicher gültig ist. Rückverfolgung: http://paste.pocoo.org/show/575594/ – theckman