2013-03-03 23 views
11

Próbuję zweryfikować sygnaturę SHA1 wiadomości, pobierając certyfikat ze strony internetowej i wyodrębniając jego klucz publiczny. Jest kilka fragmentów kodu przykładowego w innym miejscu na SO (here i here), jednak jeszcze nie doszedłem do tego, co robię źle.Próba zweryfikowania podpisu wiadomości SHA1 za pomocą języka Python. Co ja robię źle?

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 

To daje mi następujący błąd twierdzenie:

File "/tmp/test.py", line 71, in verify_message 
    assert pubkey.verify_final(sig) == 1 
AssertionError 

Jednakże, jeśli mogę użyć openssl z wiersza poleceń wraz z plików generowanych z powyższego skryptu Pythona, to działa dobrze:

[[email protected] tmp]$ openssl dgst -sha1 -verify mypubkey.pem -signature sig msg 
Verified OK 

Uderzyłem tutaj w mur; wszelkie sugestie będą bardzo mile widziane. Dzięki!

+0

dlaczego uważasz, że musisz base64 dekodować podpis? –

+0

@GregS Dzięki za odpowiedź. Sygnatura jest przesyłana przez HTTP POST wraz z samą wiadomością; to kodowanie base64, kiedy go otrzymam. Pominąłem ten krok dla jasności. – jamieb

+0

Działa to dobrze dla mnie na Ubuntu z openssl 1.0.1 i m2crypto 0.21.1. Z jakimi wersjami współpracujesz? – wrgrs

Odpowiedz

1

Ten kod działa perfekcyjnie na mojej stronie.