Ich versuche die SHA1-Signatur einer Nachricht zu überprüfen, indem ich ein Zertifikat von einer Website herunterlade und den öffentlichen Schlüssel extrahiere. Es gibt ein paar Bits von Beispielcode an anderer Stelle auf SO (here und here), aber ich habe noch nicht herausgefunden, was ich falsch mache.Der Versuch, die SHA1-Nachrichtensignatur mit Python zu überprüfen. Was mache ich falsch?
import requests
from M2Crypto import BIO, RSA, EVP, X509
def verify_message(cert_url, msg, sig):
cert_text = requests.get(cert_url, verify=True)
cert = X509.load_cert_string(cert_text.content)
pubkey = cert.get_pubkey()
sig = sig.decode('base64')
# Write a few files to disk for debugging purposes
f = open("sig", "wb")
f.write(sig)
f.close()
f = open("msg", "w")
f.write(msg)
f.close()
f = open("mypubkey.pem", "w")
f.write(pubkey.get_rsa().as_pem())
f.close()
pubkey.reset_context(md='sha1')
pubkey.verify_init()
pubkey.verify_update(msg)
assert pubkey.verify_final(sig) == 1
Das gibt mir die folgende Behauptung Fehler:
File "/tmp/test.py", line 71, in verify_message
assert pubkey.verify_final(sig) == 1
AssertionError
Wenn ich jedoch openssl
von der Befehlszeile zusammen mit den Dateien aus der obigen Python-Skript erzeugt, es funktioniert gut:
[[email protected] tmp]$ openssl dgst -sha1 -verify mypubkey.pem -signature sig msg
Verified OK
Ich habe hier eine Mauer geschlagen; irgendwelche Vorschläge würden sehr geschätzt werden. Vielen Dank!
Warum glauben Sie, dass Sie die Signatur base64 decodieren müssen? –
@GregS Danke für die Antwort. Die Signatur wird über einen HTTP-POST zusammen mit der Nachricht selbst übertragen. Es ist Base64 codiert, wenn ich es bekomme. Ich habe diesen Schritt aus Gründen der Übersichtlichkeit weggelassen. – jamieb
Das funktioniert für mich auf Ubuntu mit openssl 1.0.1 und m2crypto 0.21.1. Mit welchen Versionen arbeiten Sie? – wrgrs