validar online leer firmar firma con certificado c# xml digital-signature digital-certificate x509certificate2

online - leer certificado digital c#



En C#, firme un xml con un certificado x.509 y verifique la firma (3)

Estoy intentando firmar un archivo XML con un certificado x.509, puedo usar la clave privada para firmar el documento y luego usar el método CheckSignature (tiene una sobrecarga que recibe un certificado como parámetro) para verificar la firma.

El problema es que el usuario que valida la firma debe tener el certificado, mi preocupación es que si el usuario tiene el certificado, entonces tiene acceso a la clave privada y, según tengo entendido, esto es privado y debería estar disponible solo para el usuario. quien firma.

¿Qué me estoy perdiendo?

Gracias por tu ayuda.


Cualquier certificado tiene una parte pública y otra privada. Sólo envías alrededor de la parte pública. Simplemente abra cualquier sitio web habilitado para SSL en su navegador, haga clic en el símbolo del candado y eche un vistazo a su certificado.


En .NET, si obtiene su certificado X509 de un archivo .pfx, como este:

X509Certificate2 certificate = new X509Certificate2(certFile, pfxPassword); RSACryptoServiceProvider rsaCsp = (RSACryptoServiceProvider) certificate.PrivateKey;

Luego puede exportar la porción de clave pública de esta manera:

rsaCsp.ToXmlString(false);

La parte "falsa" dice, solo exportar la pieza pública, no exportar la pieza privada. (doc para RSA.ToXmlString )

Y luego en la aplicación de verificación, usar

RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); csp.FromXmlString(PublicKeyXml); bool isValid = VerifyXml(xmlDoc, rsa2);

Y el VerifyXml llama a CheckSignature() . Se ve algo como esto:

private Boolean VerifyXml(XmlDocument Doc, RSA Key) { // Create a new SignedXml object and pass it // the XML document class. var signedXml = new System.Security.Cryptography.Xml.SignedXml(Doc); // Find the "Signature" node and create a new XmlNodeList object. XmlNodeList nodeList = Doc.GetElementsByTagName("Signature"); // Throw an exception if no signature was found. if (nodeList.Count <= 0) { throw new CryptographicException("Verification failed: No Signature was found in the document."); } // Though it is possible to have multiple signatures on // an XML document, this app only supports one signature for // the entire XML document. Throw an exception // if more than one signature was found. if (nodeList.Count >= 2) { throw new CryptographicException("Verification failed: More that one signature was found for the document."); } // Load the first <signature> node. signedXml.LoadXml((XmlElement)nodeList[0]); // Check the signature and return the result. return signedXml.CheckSignature(Key); }


En primer lugar, debe asegurarse de que el certificado .pfx o .cer que está utilizando esté destinado a fines de firma.

You can check same in General Tab of a certificate *.Proves your identity to a remote computer *.Protects e-mail messages *.Allows data to be signed with the current time *.Allows data on disk to be encrypted *.2.16.356.100.2 **Document Signing**

here se escribe una aplicación de consola completa para firmar / verificar digitalmente XmlDocument en C #.