Saltar al contenido

La firma SHA256 deja de funcionar en .NET 4.5

Solución:

Tuve el mismo problema con XmlDsig (tratando de hacer una firma envolvente del documento xml con el algoritmo RSA-SHA256). Primero estaba recibiendo una excepción

System.Security.Cryptography.CryptographicException: No se pudo crear SignatureDescription para el algoritmo de firma proporcionado.

Entonces encontré mención de RSAPKCS1SHA256SignatureDescription – implementación de descripción de firma para firmas RSA-SHA256.
Implementación completa aquí:
http://clrsecurity.codeplex.com/SourceControl/changeset/view/47833#269110
o aquí: https://gist.github.com/sneal/f35de432115b840c4c1f

Tienes que llamar manualmente una vez por dominio de aplicación:

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

Después de eso, obtuve una nueva excepción:

System.Security.Cryptography.CryptographicException: se ha especificado un algoritmo no válido.

Esto me llevó a tu pregunta. Después de leer el artículo sugerido, he creado una nueva clave y certificado (con OpenSSL) usando Microsoft Enhanced RSA and AES Cryptographic Provider.
Para mi sorpresa, este nuevo certificado me permitió hacer una firma con éxito.

Después de investigar un poco más, encontré una respuesta interesante de Andrew aquí https://stackoverflow.com/a/17285774/328785, donde usó RSACryptoServiceProvider preparar SecretKey para SignedXml clase. Específicamente esta parte (mi interpretación):

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var certificates =  store.Certificates.Find(X509FindType.FindBySerialNumber,  "54dba096", true);
var certificate = certificates[0];

// next three lines
var cspParams = new CspParameters(24) { KeyContainerName = "XML_DSIG_RSA_KEY" };
var key = new RSACryptoServiceProvider(cspParams);
key.FromXmlString(certificate.PrivateKey.ToXmlString(true));

SignedXml sxml = new SignedXml(doc);
sxml.SigningKey = key;

¡Y estas soluciones funcionaron bien incluso con la llave vieja!

Si bien esta pregunta se hizo hace casi un año, ha recibido algunos votos positivos recientemente, lo que puede indicar que otras personas están teniendo el mismo problema. Con suerte, esta respuesta puede ayudar 🙂 Hablando brevemente, el error no ocurre en todas las máquinas, sino solo en algunas de ellas. Supongo que depende de qué CSP se hayan registrado en una máquina específica. De todos modos, en mi caso específico, el certificado se generó con “Microsoft RSA SChannel …” o “Microsoft fuerte proveedor criptográfico” como CSP. Genere un nuevo certificado, pero utilicé “Microsoft Enhanced RSA y AES Cryptographic Provider” como CSP y la firma SHA256 comenzó a funcionar para mí.

Algunas referencias:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e391ba75-ce6e-431c-bfc9-26a71ae1b033/sha256-signing-stops-working-in-net-45?forum=Geneva (como usted puedo ver, millones de gracias a Paul que me ayudó a resolver este problema)

http://hintdesk.com/c-how-to-fix-invalid-algorithm-specified-when-signing-with-sha256/

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *