none
Problema al firmar archivo xml RRS feed

  • Pregunta

  • Hola, tengo el siguiente problema:

    Estoy generando una firma de un archivo xml de la siguiente forma:

    public void SignXmlDocument(ref XmlDocument objxmlDocument, X509Certificate2 objCertificate, string strReferenceToSign = "")
           
            {
                SignedXml objSignedXML = new SignedXml(objxmlDocument);
                objSignedXML.SigningKey = objCertificate.PrivateKey;
                // Añade la clave al documento SignedXml
                Signature XMLSignature = objSignedXML.Signature;
                // Asigna el identificador de referencia
                Reference reference = new Reference();
                reference.Uri = "#" + strReferenceToSign;
                //Se agrega la transformacion
                reference.AddTransform(new XmlDsigC14NTransform());
                // Añade la información de los parámetros de firma
                XMLSignature.SignedInfo.AddReference(reference);
                //objSignedXML.AddReference(reference);
                KeyInfo kinfo = new KeyInfo();
                kinfo.AddClause(new RSAKeyValue((RSA)objCertificate.PrivateKey));
                //Agrega informacion del certificado
                kinfo.AddClause(new KeyInfoX509Data(objCertificate));
                XMLSignature.KeyInfo = kinfo;
                //objSignedXML.Signature.KeyInfo = GetKeyInfoFromCertificate(objCertificate);
                // Calcula la firma
                objSignedXML.ComputeSignature();
                XmlElement xmlDigitalSignature = objSignedXML.GetXml();
                // Añade el elemento firmado al documento XML
                objxmlDocument.DocumentElement.AppendChild(objxmlDocument.ImportNode(xmlDigitalSignature, true));
                if (objxmlDocument.FirstChild is XmlDeclaration)
                {
                    objxmlDocument.RemoveChild(objxmlDocument.FirstChild);
                }
                if (strReferenceToSign == "SetDoc")
                { objxmlDocument.Save("DTEFXXX.xml"); }
                else
                { objxmlDocument.Save("DTEFXX.xml"); }
            }

    El archivo xml es como el siguiente

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <EnvioDTE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    	<SetDTE ID="SetDoc">
    		<Caratula version="1.0">
    			...
    			<FchResol>2011-06-13</FchResol>
    			<NroResol>0</NroResol>
    			<TmstFirmaEnv>2016-05-09T15:12:39</TmstFirmaEnv>
    			<SubTotDTE>
    				<TpoDTE>33</TpoDTE>
    				<NroDTE>1</NroDTE>
    			</SubTotDTE>
    		</Caratula>
    		<DTE version="1.0">
    			<Documento ID="FXXXX">
                                     .
                                     .
                                     .
                            </Documento>
                    </DTE>
             </SetDTE>
    </EnvioDTE>

    Pero al referenciar el URI = "#FXXXX" la Signature me queda dentro del nodo EnvioDTE y necesito que quede bajo el nodo Documento. ¿cómo puedo hacer eso? ¿me falta algo en la referencia?

    martes, 10 de mayo de 2016 20:36