none
Reemplazar nodo XML de firma electronica (Signature) RRS feed

  • Pregunta

  • Tengo la siguiente función para firmar un comprobante electrónico y mi objetivo es que todos los datos de la firma se muestre en el nodo XML "Signature" que lo he creado previamente, es decir existe en mi archivo FileXML pero está vacío.

    Estoy usando la función RemplaceChild pero mi variable NodoSignature me da NULL. Agradecería mucho cualquier ayuda. Cómo puedo identificar mi nodo Signature y como reemplazo todo el valor de xmlSig?

    public void FirmarXML(string strFileXML)
    {
                string l_xml = Path.Combine(path, @"DATA/", strFileXML);
                XmlDocument FileXML = new XmlDocument();
                FileXML.Load(l_xml);
    
                X509Certificate2 cert = new X509Certificate2(File.ReadAllBytes(Certificado), CerPass);
    
                SignedXml signedXml = new SignedXml(FileXML);
                signedXml.SigningKey = cert.PrivateKey;
    
                Reference reference = new Reference();
                reference.Uri = "";
                reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
                signedXml.AddReference(reference);
    
                KeyInfo keyInfo = new KeyInfo();
                keyInfo.AddClause(new KeyInfoX509Data(cert));
    
                signedXml.KeyInfo = keyInfo;
                signedXml.ComputeSignature();
                XmlElement xmlSig = signedXml.GetXml();
    
                XmlNode NodoSignature = FileXML.DocumentElement.ParentNode["Signature"];
    
                FileXML.DocumentElement.ReplaceChild(FileXML.ImportNode(xmlSig, true), NodoSignature);
    
                File.WriteAllText(Path.Combine(path, @"FIRMA\", strFileXML), FileXML.OuterXml);
    }

    jueves, 4 de abril de 2019 0:41

Respuestas

  • Ya lo solucioné.

    Finalmente pude llegar recorrer mi FileXML y eliminar mi nodo con el siguiente código:

    FileXML.DocumentElement.FirstChild.FirstChild.FirstChild.RemoveChild(FileXML.DocumentElement.FirstChild.FirstChild.FirstChild.FirstChild);

    Y luego lo agregué, ya con todos los datos de la firma con el siguiente código:

    FileXML.DocumentElement.FirstChild.FirstChild.FirstChild.AppendChild(FileXML.ImportNode(xmlSig, true));

    • Marcado como respuesta Alcy sábado, 6 de abril de 2019 22:58
    sábado, 6 de abril de 2019 22:57

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://social.msdn.microsoft.com/Forums/es-ES/e29081d7-3a19-46bd-b88b-fe31f70d9121/firma-electronica-a-un-xml?forum=vcses

    https://social.msdn.microsoft.com/Forums/es-ES/3c267b17-9702-4372-b38a-f15875ca1ff7/firma-electronica-xades-bes?forum=vcses

    https://social.msdn.microsoft.com/Forums/es-ES/af7d0717-0f68-4d76-81a6-61cc14ee6227/reemplazar-un-nodo-completo-por-otro?forum=vcses

    https://social.msdn.microsoft.com/Forums/es-ES/7b347dce-132f-43a5-a831-b3b0afa52996/xml-nodo?forum=netfxwebes

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 4 de abril de 2019 15:47
  • Hola Carlos.

    Gracias por la respuesta.

    En el primer enlace está la función que estoy usando, pero yo lo estoy cambiando ya que usa la función AppendChild que agrega el nodo o etiqueta al final. Yo tengo ya el nodo Signature con un Id=PasheSign previamente creado en mi XML, lo que quiero es sobre eso modificarlo y por eso pensé usar el método ReplaceChild pero no me está funcionando.

    Los demás enlaces, igual gracias, pero lamentablemente no se ajustan a lo que deseo...

    Ayúdenme por fa...

    viernes, 5 de abril de 2019 23:32
  • Ya lo solucioné.

    Finalmente pude llegar recorrer mi FileXML y eliminar mi nodo con el siguiente código:

    FileXML.DocumentElement.FirstChild.FirstChild.FirstChild.RemoveChild(FileXML.DocumentElement.FirstChild.FirstChild.FirstChild.FirstChild);

    Y luego lo agregué, ya con todos los datos de la firma con el siguiente código:

    FileXML.DocumentElement.FirstChild.FirstChild.FirstChild.AppendChild(FileXML.ImportNode(xmlSig, true));

    • Marcado como respuesta Alcy sábado, 6 de abril de 2019 22:58
    sábado, 6 de abril de 2019 22:57