Revisé muchos foros y ejemplos, pero ninguno me ayudó. Necesito verificar la firma de cualquier servicio web. Tengo un archivo test.crt con clave pública para verificar.Cómo verificar la firma, cargar la clave pública ¿Desde el archivo CRT?
static bool Verify(string text, string signature)
{
X509Certificate2 cert = new X509Certificate2(
HttpContext.Current.Server.MapPath("test-server.cert"));
RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key;
// Hash the data
SHA1Managed sha1 = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] sign = Convert.FromBase64String(signature);
byte[] hash = sha1.ComputeHash(data);
return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign);
}
Pero resultado es siempre falsa :(
Tengo un ejemplo OpenSSL:.
openssl base64 -d -in signature -out signature.bin
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway
he creado una aplicación sencilla que genera una firma para un texto e inmediatamente se verifica. Puede verificarlo aquí: https://dl.dropbox.com/u/1171045/11221877/Program.cs –
Por lo tanto, el método anterior es bastante correcto. ¿Estás seguro de que estás utilizando los certificados adecuados para firmar y verificar? –
Hice lo mismo con la aplicación web, por lo que no es una cosa web. ¿Cómo pasa una firma del servicio web a su aplicación? –