2013-03-03 14 views
11

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!

+0

perché credi che sia necessario decodificare in base64 la firma? –

+0

@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

+0

Questo funziona perfettamente con Ubuntu con openssl 1.0.1 e m2crypto 0.21.1. Con quali versioni stai lavorando? – wrgrs

risposta

1

Questo codice funziona perfettamente bene alla mia fine.