Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/03/2011, 23:12
wwwmaster
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 21 años, 5 meses
Puntos: 37
Respuesta: Firmar documento: aeatfact.dll

Al parecer hablas de España, en Mexico se firma unicamente una cadena, en brasil se genera una firma para todo el XML (enveloped se llama o algo asi), para el caso de Brasil por ejemplo use este ejemplo:

Código realizado por ElQuintero.net © (Libre distribución) *
///* Url: http://www.elquintero.net


// 1.- Se Carga el XML dentro de la clase signedXML
SignedXml sig = new SignedXml(documento);

//2.- Recuperamos la clave privada para firmar
// Obtenemos el certificado digital del almacén de certificados (obtenemos el certificado con
// el Canonical Name contenido en el parámetro subjectName), y como vamos a realizar una firma,
// introducimos la clave privada del certificado en .SigningKey

sig.SigningKey = certificado.PrivateKey;

// de JAGP
//3.- Add a KeyInfo.
//Para dar la posibilidad al receptor de comprobar la firma sin necesidad de tener el certificado,
//introducimos la clave pública del certificado dentro de la propiedad .KeyInfo.
//Como referencia y de manera opcional, introducimos el Canonical Name del certificado.
// KeyInfo keyInfo = new KeyInfo();
//////keyInfo.AddClause(new DSAKeyValue(objDSAkeyPair));
// keyInfo.AddClause(new KeyInfoX509Data(certificado));
// sig.KeyInfo = keyInfo;


//3. Add public key info to allow checking the key

sig.KeyInfo = new KeyInfo();
KeyInfoX509Data keyInfoClause = new KeyInfoX509Data(certificado);
//keyInfoClause.AddSubjectName(certificado.SubjectNa me.Name); // Con las siguientes instrucciones se agregaria tambien el X509SubjectName
sig.KeyInfo.AddClause(keyInfoClause);


//4. Set the reference to sign
//http://www.devarch.net/post/2010/01/29/Firmar-un-documento-Xml-con-SignedXml.aspx
// Como no deseamos firmar el documento Xml entero, sino el nodo acuses,
// introducimos el valor de su atributo id (viene contenido en el parámetro nodeToSign
// con valor “#response”) como referencia. En nuestro caso, ya que vamos ah hacer
// una firma Enveloped, es necesario firmar un nodo en lugar del Xml completo porque sino,
// no se podría luego validar la firma.
//(Para firmar el documento completo, reference.Uri ha de ser una cadena vacía).

Reference reference = new Reference();
//No le asignamos ninguna Url en concreto al querer firmar todo el doc.
reference.Uri = "#NFe43060392665611013155550990000069960005795 19";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); //parametro true o false??

// de JAGP
Transform transform = new XmlDsigC14NTransform(false); // incluir comentarios True, False
//Transform transform = new XmlDsigC14NTransform(true); // cambia el signature value

//-------------------------
// Esta combinacion deja OK la Diges y Signature Value pero con 14Kb.. y NO PASA LA VALIDACION
//doc.PreserveWhitespace = false
//Transform transform = new XmlDsigC14NTransform(false)

//Añadimos la transformación a la referencia
reference.AddTransform(env);
reference.AddTransform(transform);

sig.AddReference(reference);

// Si coloco aqui la 2a transform cambia la signature value
// reference.AddTransform(transform);/////
// sig.AddReference(reference);/////




//5. Compute the signature Calculamos la firma.
sig.ComputeSignature();

//6. Append node to the document
//Introducimos el Xml con la firma dentro del documento Xml.
XmlElement xmlDigitalSignature = sig.GetXml();

documento.DocumentElement.AppendChild(documento.Im portNode(xmlDigitalSignature,true)); // boolean deep
// DIGEST VALUE CORRECTO: bjdJWunzyN8Saf+e6joIlt7uvhc=
// SIGNATURE: H0erTiulPNBaRdiIclOA+PjZkz4lIuiALpQ1/jybb2roM1jtazkjulsGxOZfsoZL/ZtlMPTDQkG6P9zqmcEYRhbVhSM0tj2xEmbUFDOq6JwZWsTD3pQ B4q++rviiqjlNisrCruLsCvQjSAbPVZvST9iE2rRV4V59voG09 ho8hHg=