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!
dlaczego uważasz, że musisz base64 dekodować podpis? –
@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
Działa to dobrze dla mnie na Ubuntu z openssl 1.0.1 i m2crypto 0.21.1. Z jakimi wersjami współpracujesz? – wrgrs