Pregunta

Me voy a firmar digitalmente un documento XML y verificarlo en 2 máquinas diferentes (de firmarlo en una máquina y verificar en otro).

Estoy haciendo lo siguiente para verificar la DSIG XML en CSharp.Net.

        public static Boolean VerifyXml(XmlDocument document)
        {
            document.PreserveWhitespace = true;
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            //**Earlier was getting exception here in rsaKey object**
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

            // Create a new SignedXml object and pass it
            // the XML document class.
            SignedXml signedXml = new SignedXml(document);

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            // It's guaranteed that there's always exists a signature 
            XmlNodeList nodeList = document.GetElementsByTagName("Signature");

            // Load the <signature> node.  
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Check the signature and return the result.
            bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
            return isDone;
        }

Al principio me estaba PermissionDenied excepción cuando mi aplicación web intenta acceder al contenedor de claves. Sin embargo he temporalmente añadir el usuario de la aplicación y el usuario de IIS a función de administrador y se le asignó la política de seguridad Plena confianza a mi aplicación web utilizando caspol.

P1: [Mi primera pregunta es ¿Cuál es la mejor manera de venir sobre esto] ?? Sé que asignando fulltrust aplicación web y añadiendo al usuario función de administrador no es una idea brillante, a pesar de que funciona

La segunda pregunta es con respecto a la signedXml.CheckSignature(rsaKey); volviendo falsa. Ahora según mi entendimiento, ya que el documento XML está firmado digitalmente en un equipo diferente del MAC utiliza para firmado se almacena en el que las máquinas de contenedor de claves Nombre "XML_DSIG_RSA_KEY", pero cuando traté de verificar la firma en el equipo host diferente MAC es generada y almacenada en nombre del contenedor "XML_DSIG_RSA_KEY" en la máquina host, por lo tanto, la firma digital no quedó verificada.

P2: ¿Es esta suposición correcta ?? y cuál es la mejor manera de hacer frente a esto ... ¿Debo usar un certificado de firma digital del documento XML y luego verificar que, en ese caso. si necesito para acompañar el certificado con el documento XML DSIG. ???

¿Fue útil?

Solución

Para responder a su segunda pregunta: ¿Quiere verificar el código XML con los href="http://en.wikipedia.org/wiki/Public_key" parte pública del par de claves RSA que se utilizó para firmar el documento. Así que hay que o bien posee (y confianza) la clave pública en la máquina para verificar o para enviar el certificado que contiene la clave pública con el XML (que puede ser almacenado dentro de la estructura de la firma XML) y luego verificar que el certificado ha sido ya emitido por una autoridad de certificación de confianza.

Para implementar el primer caso, puede llamar ToXmlString(false) en la tecla en el lado emisor, almacenar el resultado en un archivo y guardar este archivo en el lado receptor. A continuación, en el extremo receptor, leer el archivo y llame a:

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);

El segundo caso se puede hacer mediante la obtención de un certificado, y agregarlo a la firma en el lado de la firma de esta manera:

KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;

Si se confía en el certificado, a continuación, puede verificar la firma en el lado receptor con sólo llamar:

bool isDone = signedXml.CheckSignature();

Para responder a su primera pregunta:. Una vez que ya no está tratando de acceder al almacén de claves privadas (que usted hacía llamando al RSACryptoServiceProvider constructor igual que lo hizo), usted debe ser capaz de ejecutar sin plena confianza

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top