Foros del Web » Programación para mayores de 30 ;) » .NET »

Firmar documento: aeatfact.dll

Estas en el tema de Firmar documento: aeatfact.dll en el foro de .NET en Foros del Web. Estoy intentando firmar digitalmente un documento usando una librería que proporcina la agencia tributaria ( https://aeat.es/facturai.html ). Lo que se hace es usar un certificado ...
  #1 (permalink)  
Antiguo 23/03/2011, 02:30
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 20 años, 9 meses
Puntos: 0
Firmar documento: aeatfact.dll

Estoy intentando firmar digitalmente un documento usando una librería que proporcina la agencia tributaria (https://aeat.es/facturai.html).

Lo que se hace es usar un certificado digital para firmar y 'encapsular' el documento original generando un nuevo archivo con extensión .F64

He copiado y pegado el siguiente código de ejemplo (en una aplicación Windows Forms) que había en las preguntas frecuentes de la agencia tributaria: https://aeat.es/factufaq.html#T11 (Trabajo con Visual Studio 2008):

1. Dim firmante As Object
2. Dim ret As Object
3. firmante = CreateObject("AEATFACT.AeatFactCtl")
4. ret = firmante.FIRMA("C:\Factura.pdf", "77403759L", "C:\Factura.fact")

Al ejecutar la aplicación me dá error en la tercera línea: 'No se puede crear el componente ActiveX'

La librería está registrada y el certificado digital correctamente instalado.

¿Alguna idea de cuál es el problema?

Si hago lo mismo pero esta vez en un proyecto web funciona pero solo cuando llamo a la página así:

http://localhost:55905/Firma/Firma.aspx

Si intento ejecutar el proyecto desde:

http://localhost/Firma/Firma.aspx

o desde el entorno real me devuelve error en la misma línea, en este caso:

Error al recuperar un generador de clases COM para el componente con CLSID {F171A6DF-F517-4ACB-A7DF-D8B8AE79D710} debido al siguiente error: 80040154.

Alguna sugerencia?

En la propia página de la agencia tributaria dicen que ya no dan soporte para este método de firmado de documentos si alguien sabe otra manera de hacerlo le estaré agradecido.

Saludos.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)
  #2 (permalink)  
Antiguo 24/03/2011, 23:12
 
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=
  #3 (permalink)  
Antiguo 30/03/2011, 08:15
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Firmar documento: aeatfact.dll

Gracias wwwmaster en cuanto tenga más tiempo le hecho un vistazo al ejemplo.

Saludos.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)

Etiquetas: documento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:01.