Sto tentando di verificare la firma SHA1 di un messaggio scaricando un certificato da un sito Web ed estraendo la sua chiave pubblica. C'è qualche bit di codice di esempio altrove su SO (here e here), tuttavia non ho ancora capito cosa sto facendo male.Provare a verificare la firma del messaggio SHA1 usando Python. Che cosa sto facendo di sbagliato?
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
questo mi dà il seguente errore di asserzione:
File "/tmp/test.py", line 71, in verify_message
assert pubkey.verify_final(sig) == 1
AssertionError
Tuttavia, se uso openssl
dalla riga di comando insieme ai file generati dallo script Python sopra, funziona benissimo:
[[email protected] tmp]$ openssl dgst -sha1 -verify mypubkey.pem -signature sig msg
Verified OK
Ho colpito un muro di mattoni qui; Ogni suggerimento sarà molto apprezzato. Grazie!
perché credi che sia necessario decodificare in base64 la firma? –
@GregS Grazie per la risposta. La firma viene trasmessa tramite un POST HTTP insieme al messaggio stesso; è codificato in base64 quando ho capito. Ho omesso quel passaggio per chiarezza. – jamieb
Questo funziona perfettamente con Ubuntu con openssl 1.0.1 e m2crypto 0.21.1. Con quali versioni stai lavorando? – wrgrs