Twisted SSL: Zertifikate vergleichen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

Hi,

ich will Zertifikate einer Netzwerkverbindung mit Zertifikatdateien aus einem Ordner vergleichen.
Ich verwende Twisted bzw. pyOpenSSL auf dem Twisted aufbaut.
Das Client Zertifikat erhalte ich mit

Code: Alles auswählen

transport.getPeerCertificate() #twisted transport
. Die Funktion returnt ein OpenSSL x509 Objekt (im folgenden "client_cert").
Auf der Festplatte hab ich Zertifikate im .pem Format. Diese lese ich mit

Code: Alles auswählen

OpenSSL.crypto.load_certificate()
ein (ebenfalls ein x509 objekt "file_cert").

Ein client_cert == file_cert ist immer False. Die einzelnen methoden die möglich auf x509 objekten sind (get_issuer(), get_serial_number(), get_version()) liefern alle die gleichen Werte.

Code: Alles auswählen

client_cert.get_pubkey() == file_cert.get_pubkey()
liefert allerdings auch false (obwohl ich mir sicher bin das es das gleiche Zertifikat ist). Wie ich mir die Public keys direkt ausgeben kann weiß ich auch nicht, mit get_pubkey() erhalte ich nur ein PKey Objekt.

Was ist also der richtige Weg Zertifikate zu vergleichen, bzw. was ist falsch an meinem Ansatz?

Viele Grüße, Hazzard
BlackJack

@Hazzard: Wie Objekte verglichen werden bestimmen die Objekte selbst, also wie die entsprechende Methode auf dem Datentyp implementiert ist. Wenn der Programmierer bei einer Klasse dort gar nichts implementiert, greift die Methode von `object` und die vergleicht nach Objektidentität. Solange es sich dann also nicht um das *selbe* Objekt handelt, sind die Exemplare immer „ungleich”, auch wenn sie bis auf die Identität, gleiche Werte repräsentieren.

Du müsstest festlegen was für Dich Gleichheit bei den Zertifikatsobjekten bedeutet und eine Funktion schreiben die das überprüft. Dabei musst Du so weit in die Objekte „hinein gehen” bis Du bei Werten ankommst, die tatsächlich den Wert vergleichen und nicht nur die Objektidentität.
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

Danke für die Antwort. Im prinzip würde es mir langen den raw byte string der public keys zu vergleichen. Allerdings finde ich keine funktion die mir die die raw bytes gibt. Für das PKey objekt sind (soweit ich das seh) nur folgende Methoden definiert: http://pythonhosted.org/pyOpenSSL/openssl-pkey.html
BlackJack

@Hazzard: Helfen die `dump_*()`-Funktionen aus dem `crypto`-Modul eventuell?
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

Danke, die dump_certificate() Funktion macht so halb was ich brauch. Allerdings wenn zb. per netzwerk eine neue version des zertifikates übertragen wird (selber public key, aber zb. von einer weiteren person unterschrieben) und mit einer alten version von der festplatte verglichen wird, wird die dump_certificate() funktion wahrscheinlich zwei unterschiedliche strings liefern. Mir wäre es lieber wenn der vergleich nur vom public key abhängig sein würde. Ob das Verhalten auch tatsächlich so ist, muss ich erst noch testen...

UPDATE: Ja ist natürlich so. Unterzeichnen des Zertifikats verändert den Rückgabewert von dump_certificate() Ich bräuchte sowas wie dump_public_key()....

EDIT:

Code: Alles auswählen

crypto.dump_privatekey(crypto.FILETYPE_ASN1, cert.get_pubkey())
macht genau was ich brauch... die doku hätte auch mal erwähnen können, das dump_privatekey auch public keys extrahieren kann...
Damit erledigt, danke für die Hilfe.
Antworten