Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Firma de XML (https://www.clubdelphi.com/foros/showthread.php?t=97620)

jahlxx 31-07-2025 21:35:31

Firma de XML
 
Buenas.


Os cuento lo que estoy haciendo, y las dudas que tengo respecto a la firma de los XML que se envían a los WS.


Estoy generando ficheros XML, por el momento con una sola factura cada vez, y controlando la respuesta. Envio altas de registros, subsanaciones y borrados, y todo bien.


Genero los XML y los envio tal cual al entorno de pruebas, mediante TIdHTTP y TIdSSLIOHandlerSocketOpenSSL. Todo perfecto.


Ahora vienen las dudas.


Es obligatorio firmar los XML? Me explico, puedo generar el XML y firmarlo con openssl, eso ya lo tengo hecho, pero realmente es necesario? Ahora los envio sin firmar y va bien, y se me genera la duda.


Y otra cosa más. En las descripciones de los XML, viene un campo llamado "Signature". Yo no lo estoy poniendo y no me da problemas. Aun así, puedo generar una firma en Base64, aunque no lo estoy poniendo porque no sé si hay que ponerlo o no.


En fin, que tengo dudas con estas dos cosas, si hay que hacerlo o no, en qué orden, etc.


Os agradecería algo de luz en este tema.


Gracias.

Neftali [Germán.Estévez] 01-08-2025 08:49:55

Cita:

Empezado por jahlxx (Mensaje 566813)
Es obligatorio firmar los XML? Me explico, puedo generar el XML y firmarlo con openssl, eso ya lo tengo hecho, pero realmente es necesario? Ahora los envio sin firmar y va bien, y se me genera la duda.

Si está implementando veri*factu (enviar los registros de facturación a la AEAT "inmediatamente" después de generarlos), NO es necesario firmar.
La firma de registros es obligatoria en el modo no-veri*factu (cuando no se envían los registros de firma voluntaria, sino bajo requerimiento).

Cita:

Empezado por jahlxx (Mensaje 566813)
En las descripciones de los XML, viene un campo llamado "Signature". Yo no lo estoy poniendo y no me da problemas. Aun así, puedo generar una firma en Base64, aunque no lo estoy poniendo porque no sé si hay que ponerlo o no.

El campo signature es el de la firma. En tus registros (si los vas a enviar) no debe aparecer.

jahlxx 01-08-2025 12:45:55

Ok, gracias.


El sistema deberá de funcionar en modo VeriFactu y NoVerifactu, por lo que necesito la posibilidad de firmar los XML, ya sea con algún componente, o llamando a alguna utilidad externa, o ...


Y en eso estoy atascado, buscando informacion pero no consigo dar con la tecla.


Esa es la ayuda que necesito del foro.


Gracias anticipadas.

jahlxx 04-08-2025 13:48:04

generacion manual de la firma
 
Bueno, al final he optado por generar la firma de manera manual, siguiendo una serie de pasos, y he conseguido generar los XML firmados. Cuando consiga hacerlo de otra manera, ampliaré el hilo. Yo uso os componentes de Devart Securebridge, pero este caso concreto no lo he conseguido hacer, por eso opto por generación "artesana".


Os cuento los pasos que he seguido, por si a alguien le sirve, o si incluso se le ocurre alguna mejora. A mi, de esta manera, me funciona.


- Generamos valor para el elemento <ds:DigestValue>, hash SHA-256 del XML completo (lógicamente sin la firma)
- Con eso ya tenemos el nodo <ds:SignedInfo>
- Ese nodo <ds:SignedInfo>, lo firmamos. En mi caso, lo hago con openssl, utilizando el certificado (de momento el de pruebas proporcionado por la AEAT)
- El resultado lo paso a Base64 (1).
- Pasamos a Base64, el certificado, para tener el elemento <ds:X509Certificate> del nodo <ds:SignatureValue> (2).
- Para terminar, con la firma en base64 (1) y el certificado, montamos el nodo <ds:SignatureValue>
- Ya teniendo los nodos <ds:SignedInfo> y <ds:SignatureValue>, se monta el nodo <ds:Signature> que se incrusta en el XML inicial y ya está listo para el envio.


Un poco artesanal, pero a mi al menos me funciona perfectamente.

El nodo <ds:RSAKeyValue> que aparece en la documentación, no lo envío ya que parece que es opcional y no se suele usar.


La franja horaria es GMT +2. Ahora son las 19:39:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi