none
Ayuda Firmar XML c# RRS feed

  • Pregunta

  • Buen día, estoy intentando firmar un XML para enviarlo a un proveedor mediante un Web Service, pero el proveedor me comenta que el dato de DigestValue SignatureValue estan erroneos ellos me enviaron como salen estos datos y son diferentes a los que me me devuelve, son los unicos datos diferentes, pongo los datos que me devuelve y los del proveedor

    Proveedor

    <DigestValue>E3wGWNsdBY7ovcY0MRbJu6qPFwo=</DigestValue>SignatureValue>YtBox2b4o+/9nwYr7ULpFJ70gXDP+jSfIjFTAkz85N3ETP1EE+SVCxtlphQl6LfgikG7PsrRo2sW77vL0QSWefNAkDQGuHEd70gyjTMdjVj7URK5u7BnWX4aHoqGYbyQEg2OxhPXXQB6ERJIYckKviuZXitY8Wrb/yQ1/CuL/Ck=</SignatureValue>

    Mis datos

    <DigestValue>iTDhLAQ6s9cdckT206Mtgm0lXgM=</DigestValue>SignatureValue>dkXswnM7hQKwUN+h5WmwReTpFmoWnqViNDMYEu15um6CNeBow3eBasWSEYBbabhZ1nvBAaUmDd5z3Jn931dkdLKzWjX6N75I0sbIF4Fe2cYr/XJi9tojGoCjQL0waI67p006VwPjvq3kiy34cUqVdJmbBdRPXYCD+VHGjTT3hoc=</SignatureValue>

    EL xml que se intenta firmar es el siguiente:

    <Cancelacion Fecha="2014-02-18T11:44:17" RfcEmisor="AAA010101AAA"><Folios><UUID>50bfe0b5-461e-4356-b447-3b4ce02c1377</UUID></Folios></Cancelacion>

    Adjunto el codigo que utilizo para firmar donde FileName es el archivo que se va a firmar y SignedFileName el XML ya firmado, agradeceria su valioso apoyo ya que llevo varios dias intentando encontrarle que me falta agregar

     public static void SignXmlFile(string FileName, string SignedFileName, RSA Key, string Certificate)
            {
                // Create a new XML document.
                XmlDocument doc = new XmlDocument();

                // Format the document to ignore white spaces.
                //doc.PreserveWhitespace = false;//false;

                // Load the passed XML file using it's name.
                doc.Load(new XmlTextReader(FileName));

                // Create a SignedXml object.
                SignedXml signedXml = new SignedXml(doc);

                // Create a reference to be signed.
                Reference reference = new Reference();
                reference.Uri = "";

                // Add the key to the SignedXml document. 
                signedXml.SigningKey = Key;
                KeyInfo keyInfo = new KeyInfo();
                
                // Create a reference to be signed.
                //Reference reference = new Reference();
                //reference.Uri = "";

                // Add an enveloped transformation to the reference.
                XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                doc.PreserveWhitespace = false;
                //Transform transform = new XmlDsigC14NTransform(false);
                reference.AddTransform(env);
                //reference.AddTransform(transform);
                
                // Add the reference to the SignedXml object.
                signedXml.AddReference(reference);

                // Create a new KeyInfo object.
               // KeyInfo keyInfo = new KeyInfo();

                // Load the X509 certificate.
                X509Certificate MSCert = X509Certificate.CreateFromCertFile(Certificate);
                //X509Certificate2
                string resultsTrue = string.Empty;
                resultsTrue = MSCert.ToString(true);

                //X509Certificate2 cert = GetCertificateBySubject("C:\\CFDV20\\CERTS\\CICE\\CIC910530TC8_1201051226S.p12");
                X509IssuerSerial xserial;
                
                xserial.IssuerName = MSCert.Issuer.ToString();
                xserial.SerialNumber = MSCert.GetSerialNumberString();

                // Load the certificate into a KeyInfoX509Data object
                // and add it to the KeyInfo object.
               // keyInfo.AddClause(new KeyInfoX509Data(MSCert));
                
                KeyInfoX509Data keyData = new KeyInfoX509Data(MSCert);
                X509IssuerSerial x509Serial;
                x509Serial.IssuerName = MSCert.Issuer.ToString();
                x509Serial.SerialNumber = MSCert.GetSerialNumberString();
                
                //keyData.AddCertificate(MSCert);

                keyData.AddIssuerSerial(x509Serial.IssuerName.ToString(), x509Serial.SerialNumber.ToString());
               // keyData.AddSubjectName(x509Serial.IssuerName);
                //keyData.AddSubjectName(MSCert.Subject.ToString());
                keyInfo.AddClause(keyData);

                //keyData.AddIssuerSerial(x509Serial.IssuerName, x509Serial.SerialNumber);
                //keyInfo.AddClause(keyData);
                
                // Add the KeyInfo object to the SignedXml object.
                signedXml.KeyInfo = keyInfo;
                
                // Compute the signature.
                signedXml.ComputeSignature();
                
                // Get the XML representation of the signature and save
                // it to an XmlElement object.
                XmlElement xmlDigitalSignature = signedXml.GetXml();

                // Append the element to the XML document.
                doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

                if (doc.FirstChild is XmlDeclaration)
                {
                    doc.RemoveChild(doc.FirstChild);
                }
                // Save the signed XML document to a file specified
                // using the passed string.
                XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
                doc.WriteTo(xmltw);
                xmltw.Close();
            }


    Saludos

    jueves, 20 de febrero de 2014 16:30

Todas las respuestas

  • Que version de framework estan utilizando?

    viernes, 21 de febrero de 2014 21:05
  • Hola Gonzalo,

    Es un placer tenerte en el foro. Esperamos tu respuesta a la última pregunta de Manuel.

    Saludos,

    Miguel

    MSDN/TechNet Soporte Comunidades

    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.

    viernes, 21 de febrero de 2014 21:11
    Moderador
  • Hola, estamos utilizando el 2.0

    Saludos

    viernes, 21 de febrero de 2014 22:40
  • Hola, ya realice tambien la prueba con el framework 4.0 y no logro llegar al mismo resultado que me indica el proveedor. 

    Saludos

    martes, 25 de febrero de 2014 17:20
  • Gracias por el feedback, te pregunte lo del framework por que en X509 existen diferentes parches para ese cifrado, ahora voy a revisar a fondo tu codigo y podre hacer una retroalimentacion.
    miércoles, 26 de febrero de 2014 19:19