2012-08-27 16 views
6

Ich glaube, dass seit diesem question, pyOpenSSL die Prüfung von Unterschriften unterstützt hat begonnen (Stand pyOpenSSL 0.11.Signatur mit pyopenssl

ich an einem Projekt arbeite, die von jemand anderem mit M2Crypto gestartet wurde. M2crypto ist wirklich schmerzhaft um auf Plattformen wie Heroku zu integrieren, da es die Verwendung von SWIG erfordert.Demzufolge versuche ich, die Abhängigkeit von M2Crypto zu entfernen und durch pyOpenSSL zu ersetzen, das einfach über Pip zu installieren ist und keine benutzerdefinierten Buildpacks und mehr benötigt, die SWIG betreffen Dinge tun.

Das Problem, das ich habe, ersetzt ein bisschen Code:

key = cert.get_pubkey() # Cert is an M2Crypto X509 object 
key = key.get_rsa() 
ret = key.verify(hashed, self.sig) 
if ret != 1: 
    # Cert invalid ... etc. 

Im Idealfall möchte ich die gleiche Funktionalität über pyOpenSSL, implementieren, aber ich fühle mich das falsche Ende des Stockes bekommen haben könnte - ich habe versucht, mit:

crypto.verify(cert, self.sig, hashed, 'sha1') 

Aber dies nicht gelingt -

[('rsa routines', 'RSA_verify', 'bad signature')] 

ich nicht herausfinden kann, ob es versagt, weil die Unterschrift tatsächlich schlecht ist, oder weil die Werte, die ich bin die Bereitstellung crypto.verify ist eigentlich nicht, was es soll verwendet werden für!

Der ursprüngliche Code, mit dem ich gespielt habe, ist here und benötigt ziemlich viel Arbeit, um aufzuräumen, aber es wurde versucht, es Schritt für Schritt zu tun, um die Funktionalität vor einem kompletten Refactoring zu ersetzen. Irgendwelche Hinweise würden sehr geschätzt werden! Kann pyOpenSSL die M2Crypto-Funktionalität hier ersetzen, und gehe ich den richtigen Weg?

Antwort

7

Also die Antwort kommt aus dem Lesen ein wenig mehr der Quelle von pyOpenSSL, mit einem Zeiger von exarkun. pyOpenSSL kann hier die M2Crypto-Abhängigkeit tatsächlich ersetzen, mit sehr geringen Änderungen am zugrunde liegenden Code.

Der Unittest für die crypto.verify() Funktion here zeigt den Anruf annehmen:

verify(good_cert, sig, content, digest) 

Folglich ist ein Fehler in meinem obigen Code war:

crypto.verify(cert, self.sig, hashed, 'sha1') 

die einfach genommen haben sollte " Daten ", anstatt Hashed, da die Signatur auf die rohe Datenfolge angewendet wurde:

Dieses Verhalten unterscheidet sich von dem von M2Crypto's Verify, das die Hash-Datenzeichenfolge zur Überprüfung verwendet. Hinweis: Ich habe mich nicht besonders intensiv mit den Funktionen von M2Crypto beschäftigt, um herauszufinden, was vor sich geht.

Dank exarkun für seine Antwort auf die pyOpenSSL mailing list, die mich auf den Fehler in meinem Aufruf zu überprüfen(), anstatt mein Verständnis von was verify() war.