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/