Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

Neftali [Germán.Estévez] 05-10-2021 08:41:00

Cita:

Empezado por espinete (Mensaje 543321)
Después de firmarlo no he hecho ninguna modificación (salvo guardarlo con otro nombre).
Revisaré mañana el contenido del XML por si hay caracteres especiales, pero lo dudo mucho porque estoy usando datos de prueba muy básicos.


Hemos hablado antes de este error. Revisa mensajes anteriores.
Es posible que el contenido se esté modificando, aunque no sea de forma consciente. Revisa si después de firmar el XML hasta que lo envías ha cambiado el contenido (a veces simplemente se guarda con otra codificación). No porque lo hagas tú, sino porque lo haga el propio Delphi en alguno de los pasos (guardar, recuperar,...).

Band 05-10-2021 09:38:38

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 543331)
Hemos hablado antes de este error. Revisa mensajes anteriores.
Es posible que el contenido se esté modificando, aunque no sea de forma consciente. Revisa si después de firmar el XML hasta que lo envías ha cambiado el contenido (a veces simplemente se guarda con otra codificación). No porque lo hagas tú, sino porque lo haga el propio Delphi en alguno de los pasos (guardar, recuperar,...).


A eso es a lo que me refería antes, que una vez firmado, sea cual sea la acción que realices sobre el fichero no se puede modificar nada o habrá errores en la validación de firma. Como bien dice Neftali, no porque uno mismo lo haga, sino el propio delphi o lenguaje usado que pueden "dar por culo" en este sentido sin que uno lo sepa.

ermendalenda 05-10-2021 10:27:28

Cita:

Empezado por Band (Mensaje 543333)
A eso es a lo que me refería antes, que una vez firmado, sea cual sea la acción que realices sobre el fichero no se puede modificar nada o habrá errores en la validación de firma. Como bien dice Neftali, no porque uno mismo lo haga, sino el propio delphi o lenguaje usado que pueden "dar por culo" en este sentido sin que uno lo sepa.

Hemos coincidido todos

elcharlie 05-10-2021 10:39:59

Una duda que tengo, y a ver si alguien me sabe responder, ¿como haceis para saber si el servicio-url está activo? Lo digo porque ahora que está caido el servidor de Bizkaia de Pruebas, no tenga que estar esperando al Timeout siempre.
No sé si hay manera o simplemente es asi.

ermendalenda 05-10-2021 11:15:40

Cita:

Empezado por elcharlie (Mensaje 543336)
Una duda que tengo, y a ver si alguien me sabe responder, ¿como haceis para saber si el servicio-url está activo? Lo digo porque ahora que está caido el servidor de Bizkaia de Pruebas, no tenga que estar esperando al Timeout siempre.
No sé si hay manera o simplemente es asi.

Creo que no hay otra forma. Te puedes hacer un pequeño algottirmo que cada fallo aumente el tiempo del siguiente reintento, hasta un tope de 30min por ejemplo, y reinicies el temporizador cuando haya conexión. Teniendo en cuenta de que hay que mandarlas en orden en cuanto haya conexión.
Por otro lado puedes hacer una conexión previa con un fichero vacio(esta en este hilo unos cuantos posts atrás) y ponerle un timeout muy corto.
O combinar los 2.

Ramon88 05-10-2021 12:01:24

Cita:

Empezado por iMia (Mensaje 543320)


Si si, ya lo tengo, gracias!^\||/
Por mas que os leía no me funcionaba y era por que lo convertía SOLO para abrir el enlace ,sin calcular el CRC de nuevo.
Me ha sido un poco lioso, pero ya está!


Gracias!

elcharlie 05-10-2021 12:51:14

Cita:

Empezado por ermendalenda (Mensaje 543337)
Creo que no hay otra forma. Te puedes hacer un pequeño algottirmo que cada fallo aumente el tiempo del siguiente reintento, hasta un tope de 30min por ejemplo, y reinicies el temporizador cuando haya conexión. Teniendo en cuenta de que hay que mandarlas en orden en cuanto haya conexión.
Por otro lado puedes hacer una conexión previa con un fichero vacio(esta en este hilo unos cuantos posts atrás) y ponerle un timeout muy corto.
O combinar los 2.

Pues nada, así lo haré, era por si había alguna otra manera mas rápida de comprobarlo...
Muchas gracias por todo.

Eric Mtz 05-10-2021 13:30:24

Fechas de Batuz :)
 
Muy buenas señores del internete, sigo vivo, tan solo os quería compartir una respuesta de BATUZ que me ha hecho mucha gracia, el caso es que les he preguntado si tenemos algún servidor de pruebas en Bizkaia ahora que nos han cerrado el de siempre y el nuevo parece que le queda medio mes de cocción.

Respuesta:
Cita:

Kaixo,
El 30 de Septiembre se cerró el entorno de pruebas de los servicios web del LROE que llevaba habilitado desde noviembre de 2020. Está previsto habilitar a mediados de octubre el entorno real del LROE a modo de pruebas.

En este periodo, por labores de mantenimiento, no hay un entorno disponible para probar. Sentimos la molestias y quedamos a su disposición para realizar revisiones manuales de ficheros o contestar las dudas que pudieran surgirle.

Agur bat

Me turboflipa la decisión de quitar los servidores un par de semanas, de hecho me alaga, creo que piensan que somos tan buenos que podemos dedicar el tiempo a... nose cultivar olivos en nuestra finca en venus o a meditar sobre la ingeniosa e infravalorada característica de comprimir un archivo gzip dos veces, yo iría mas allá y publicaría el servidor a una semana de su obligatoriedad, total solo afectará a los nervios de cuatro programadores que como mucho les pondrán a parir en un foro perdido de la mano de Batuz.

Que opináis?, también os maravillan las nuevas medidas para aumentar el índice de motivación de los programadores?

Neftali [Germán.Estévez] 05-10-2021 14:01:20

Cita:

Empezado por Eric Mtz (Mensaje 543343)
Me turboflipa la decisión de quitar los servidores un par de semanas, de hecho me alaga, creo que piensan que somos tan buenos que podemos dedicar el tiempo a... nose cultivar olivos en nuestra finca en venus o a meditar sobre la ingeniosa e infravalorada característica de comprimir un archivo gzip dos veces, yo iría mas allá y publicaría el servidor a una semana de su obligatoriedad, total solo afectará a los nervios de cuatro programadores que como mucho les pondrán a parir en un foro perdido de la mano de Batuz.

Que opináis?, también os maravillan las nuevas medidas para aumentar el índice de motivación de los programadores?


:D:D:D:D
Creo que más o menos todos estamos pensando lo mismo...

¿Y si había alguien usando producción?
No se si se da el caso, pero si es así, ese si que debe estar flipando...

espinete 05-10-2021 14:41:18

Cita:

Empezado por ermendalenda (Mensaje 543312)
Tiene que quedar así:

Aquí te dejo un par de verificadores de xmls firmados, que están en el foro(No de ticketbai, son genéricos):
http://tools.chilkat.io/xmlDsigVerif...#generatedCode
https://web.uanataca.com/pe/servicio...ma-electronica

Según chilkat:

Signature Verified
Number of Reference Digests = 2
Reference 1 digest is valid.
Reference 2 digest is valid.


Según el otro (con la opción que permite comparar el archivo SIN firmar y el firmado):

"El documento no ha sido modificado después de la firma"
"Certificado de CA confiable"

espinete 05-10-2021 14:50:14

Cita:

Empezado por ermendalenda (Mensaje 543312)
Tiene que quedar así:
Código:

<?xml version="1.0" encoding="UTF-8"?>
<T:TicketBai xmlns:T="urn:ticketbai:emision" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd">
<Cabecera>
<IDVersionTBAI>1.2</IDVersionTBAI>
</Cabecera>

.
.
.
.
<HuellaTBAI>
.
.
.
</HuellaTBAI>
<ds:Signature
.
.
..
</ds:Signature>
</T:TicketBai>


Así queda, salvo la primera línea, que en mi XML no existe:

<?xml version="1.0" encoding="UTF-8"?>

No obstante, eso no explica el error "El mensaje ha sido modificado en tránsito o la firma no está bien realizada".

De verdad que no sé en qué proceso se puede estar modificando el contenido del archivo.

A ver si va a ser porque yo estoy en Canarias y hay algún problema con la diferencia horaria...

Band 05-10-2021 15:15:26

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 543344)
:D:D:D:D
Creo que más o menos todos estamos pensando lo mismo...

¿Y si había alguien usando producción?
No se si se da el caso, pero si es así, ese si que debe estar flipando...


Sé que ya había alguien usando producción y no me imagino lo que estarán pensando (o si? :D)

Yo de verdad no entiendo cómo se pueden llegar a estas fumadas... pero viendo quienes están en el poder, no me sorprende nada :D:D:D

Band 05-10-2021 15:23:55

Cita:

Empezado por espinete (Mensaje 543347)
Así queda, salvo la primera línea, que en mi XML no existe:

<?xml version="1.0" encoding="UTF-8"?>

No obstante, eso no explica el error "El mensaje ha sido modificado en tránsito o la firma no está bien realizada".

De verdad que no sé en qué proceso se puede estar modificando el contenido del archivo.

A ver si va a ser porque yo estoy en Canarias y hay algún problema con la diferencia horaria...


Como envías el fichero? Lo digo porque yo lo hago con curl y si no usaba este parámetro:

--data-binary

Se enviaba con alguna modificación y me salía también este mensaje: "El mensaje ha sido modificado en tránsito o la firma no está bien realizada"

ermendalenda 05-10-2021 15:45:27

Cita:

Empezado por espinete (Mensaje 543347)
Así queda, salvo la primera línea, que en mi XML no existe:

<?xml version="1.0" encoding="UTF-8"?>

No obstante, eso no explica el error "El mensaje ha sido modificado en tránsito o la firma no está bien realizada".

De verdad que no sé en qué proceso se puede estar modificando el contenido del archivo.

A ver si va a ser porque yo estoy en Canarias y hay algún problema con la diferencia horaria...

No es descabellado Prueba a forzar la hora del pc a hora peninsular.
De todas formas la primera línea es necesaria. Y haz caso eel comentario de Band, lo puede modificar la aplicación que envía si no está bien parametrizada.

ermendalenda 05-10-2021 15:56:14

Cita:

Empezado por espinete (Mensaje 543346)
Según chilkat:

Signature Verified
Number of Reference Digests = 2
Reference 1 digest is valid.
Reference 2 digest is valid.


Según el otro (con la opción que permite comparar el archivo SIN firmar y el firmado):

"El documento no ha sido modificado después de la firma"
"Certificado de CA confiable"

Falta 1 digest value
Pueden ser varias cosas. Ve arreglando lo de la primera línea y si te sigue faltando 1 digest revisa paramettos de firma y si está bien edita el fichero con un editor hexadecimal para asegurarte y revisa cada carácter comparándolo con algún xml correcto de los que hayan puesto de ejemplo.

espinete 05-10-2021 15:57:39

El envío lo hago tal como indiqué en el primer mensaje, usando el código encontrado en este hilo:

Código Delphi [-]
    RequestBody := TFileStream.Create('firmado.xml', fmOpenRead);

    NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12];
    NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml';
    NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8';

    AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);

He probado a comentar la siguiente línea:

NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8';

y ocurre lo mismo.

También he añadido manualmente ANTES DE FIRMAR la línea...

<?xml version="1.0" encoding="UTF-8"?>

...al XML (Delphi no la añade al generar el xml con el databinding) y obtengo el mismo error.

Esta tarde probaré a cambiar la HORA al horario peninsular, a ver si es eso.

Ramon88 05-10-2021 16:50:53

Cita:

Empezado por espinete (Mensaje 543356)
El envío lo hago tal como indiqué en el primer mensaje, usando el código encontrado en este hilo:

Código Delphi [-] RequestBody := TFileStream.Create('firmado.xml', fmOpenRead); NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12]; NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml'; NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8'; AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);


He probado a comentar la siguiente línea:

NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8';

y ocurre lo mismo.

También he añadido manualmente ANTES DE FIRMAR la línea...

<?xml version="1.0" encoding="UTF-8"?>

...al XML (Delphi no la añade al generar el xml con el databinding) y obtengo el mismo error.

Esta tarde probaré a cambiar la HORA al horario peninsular, a ver si es eso.


Lo tienes en c#? si es así puedo mandarte mi código en .Net y si tienes alguna duda puedo ayudarte hasta donde pueda...
EDITO: Termino de ver que es delphi,,, pero reitero que yo tenia un problema parecido y era por que luego de firmar no mantenia los espacios. Estas mostrandonos el código donde envias el post, pero creo que el problema está al cargar el XML, o lo que hagas despues de firmarlo.

ermendalenda 05-10-2021 19:27:58

Cita:

Empezado por espinete (Mensaje 543356)
El envío lo hago tal como indiqué en el primer mensaje, usando el código encontrado en este hilo:

Código Delphi [-] RequestBody := TFileStream.Create('firmado.xml', fmOpenRead); NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12]; NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml'; NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8'; AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);


He probado a comentar la siguiente línea:

NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8';

y ocurre lo mismo.

También he añadido manualmente ANTES DE FIRMAR la línea...

<?xml version="1.0" encoding="UTF-8"?>

...al XML (Delphi no la añade al generar el xml con el databinding) y obtengo el mismo error.

Esta tarde probaré a cambiar la HORA al horario peninsular, a ver si es eso.

Parece que lo del UTf-8 y noBOM lo tienes bastante mirado y despues de ver que solo te genera 2 digest, me inclinaria por empezar a revisar los parametros de firma, no sé si SecureBlackBox no lo necesita, pero es raro que no haya que decirle por ejemplo que es tipo de firma XADES;
veo campos vacios:
firmante.r_ID := '';
firmante.r_Metodo_Canonicalization := '';

Y deberia haber un Algoritmo del Metodo canonizador, etc,etc..
...CanonicalizationMethod:="http://www.w3.org/TR/2000/WD-xml-c14n-20000710";
....EnableXAdES := True;
...XAdESVersion :=...
.XAdESForm :=...

espinete 05-10-2021 19:43:41

Cita:

Empezado por Ramon88 (Mensaje 543358)
Lo tienes en c#? si es así puedo mandarte mi código en .Net y si tienes alguna duda puedo ayudarte hasta donde pueda...
EDITO: Termino de ver que es delphi,,, pero reitero que yo tenia un problema parecido y era por que luego de firmar no mantenia los espacios. Estas mostrandonos el código donde envias el post, pero creo que el problema está al cargar el XML, o lo que hagas despues de firmarlo.

1. He probado lo de la hora peninsular y sigue igual.

2. No entiendo lo de "falta un digest". Si el problema está en el código de la firma (con SecureBlackBox), el código lo he sacado de este mismo hilo, y creo que es el mismo que se usaba para FacturaE (que, por cierto, publiqué yo mismo hace años)

3. He tenido que usar un editor HEX online para comparar ambos archivos: el firmado y el sin firmar, y he encontrado una diferencia:

Archivo SIN firmar (factura.xml):

<CabeceraFactura>
<SerieFactura></SerieFactura>
<NumFactura>164</NumFactura>

Archivo firmado (firmado.xml)

<CabeceraFactura>
<SerieFactura/>
<NumFactura>164</NumFactura>

¿A donde ha ido el </SerieFactura> que falta? ¿Acaso el proceso de firma quita ese dato?

A simple vista es lo único que falta, salvo eso de que me "falta un digest". Si el código que he usado es el que está en este hilo (aquí), no entiendo lo del digest.

espinete 05-10-2021 19:47:44

Cita:

Empezado por ermendalenda (Mensaje 543365)
Parece que lo del UTf-8 y noBOM lo tienes bastante mirado y despues de ver que solo te genera 2 digest, me inclinaria por empezar a revisar los parametros de firma, no sé si SecureBlackBox no lo necesita, pero es raro que no haya que decirle por ejemplo que es tipo de firma XADES;
veo campos vacios:
firmante.r_ID := '';
firmante.r_Metodo_Canonicalization := '';

Y deberia haber un Algoritmo del Metodo canonizador, etc,etc..
...CanonicalizationMethod:="http://www.w3.org/TR/2000/WD-xml-c14n-20000710";
....EnableXAdES := True;
...XAdESVersion :=...
.XAdESForm :=...

Esos campos están vacíos porque en el procedure de la firma con SecureBlackBox los relleno manualmente, usando las propias variables, etc. de SecureBlackBox:

sbxXAdESSigner1.SignatureType := cxstEnveloped;
sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;
sbxXAdESSigner1.HashAlgorithm := firmante.r_Hash_algorithm; // SHA256
sbxXAdESSigner1.XMLElement := ''; // Todo el documento
sbxXAdESSigner1.EnableXAdES := True;
sbxXAdESSigner1.XAdESVersion := xav132;
sbxXAdESSigner1.XAdESForm := xafEPES;
sbxXAdESSigner1.Config('SigPolicyID=' + firmante.r_SigPolicyID); // https://ticketbai.eus/politicafirma');
sbxXAdESSigner1.Config('SigPolicyHash=' + firmante.r_SigPolicyHash); // 39D59C038EBB3B7DF6C61ED2F740B318F0C50F93ADCD35E26BE8FF8E76D21DA8;
sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=' + firmante.r_SigPolicyHashAlgorithm); //=SHA256;
sbxXAdESSigner1.Config('SigPolicyURI=' + firmante.r_SigPolicyURI); //https://ticketbai.eus/politicafirma;

espinete 05-10-2021 20:15:50

Además de la desaparición de </SerieFactura> en el archivo firmado, que no tengo ni idea de por qué ocurre (y ni siquiera sé si eso solucionará el problema), he estado usando varios editores de texto avanzados (no el bloc de notas) que me dicen la codificación de los archivos generados.

He estado haciendo pruebas, cambiando la codificación antes, después, en el propio XMLDocument, etc. y obtengo resultados diferentes.

De hecho, el propio componente de firma de SecureBlackBoxpermite especificar la codificación del archivo resultante.

Haciendo varias pruebas he conseguido que el XML incluya la línea...

<?xml version="1.0" encoding="UTF-8"?>

pero el archivo firmado la incluye así:

<?xml version="1.0" encoding="utf-8"?> (utf-8 en minúsculas)

Pero no quiero seguir haciendo pruebas si finalmente el problema va a estar en algo más simple, como que falta el cierre de </SerieFactura> en el XML firmado y no sé por qué.
Eso sí sería una causa más que probable para que me devuelva el error que me está dando desde hace días.

ermendalenda 05-10-2021 20:25:45

Cita:

Empezado por espinete (Mensaje 543366)
1. He probado lo de la hora peninsular y sigue igual.

2. No entiendo lo de "falta un digest". Si el problema está en el código de la firma (con SecureBlackBox), el código lo he sacado de este mismo hilo, y creo que es el mismo que se usaba para FacturaE (que, por cierto, publiqué yo mismo hace años)

3. He tenido que usar un editor HEX online para comparar ambos archivos: el firmado y el sin firmar, y he encontrado una diferencia:

Archivo SIN firmar (factura.xml):

<CabeceraFactura>
<SerieFactura></SerieFactura>
<NumFactura>164</NumFactura>

Archivo firmado (firmado.xml)

<CabeceraFactura>
<SerieFactura/>
<NumFactura>164</NumFactura>

¿A donde ha ido el </SerieFactura> que falta? ¿Acaso el proceso de firma quita ese dato?

A simple vista es lo único que falta, salvo eso de que me "falta un digest". Si el código que he usado es el que está en este hilo (aquí), no entiendo lo del digest.

En un xml si está un campo vacío es equivalente a poner <nombre de campo></nombredecanpo>
Que
</nombre de campo>
No he mirado si las especificaciones indican que mejor no ponerlo que ponerlo vacío en caso de no usar la serie.
Ya lo único que veo es que pongas un ejemplo de unxml firmado(cambiando datos sensibles) para que lo repasemos.

ermendalenda 05-10-2021 23:10:37

Cita:

Empezado por ermendalenda (Mensaje 543370)
En un xml si está un campo vacío es equivalente a poner <nombre de campo></nombredecanpo>
Que
</nombre de campo>
No he mirado si las especificaciones indican que mejor no ponerlo que ponerlo vacío en caso de no usar la serie.
Ya lo único que veo es que pongas un ejemplo de unxml firmado(cambiando datos sensibles) para que lo repasemos.

Rectifico <nombrecampo/> con la barra al final.
Los campos vacíos siempre se van a ver así después de firmarlo con los firmadores que he visto.

keys 06-10-2021 08:15:56

Cita:

Empezado por Band (Mensaje 543349)
Sé que ya había alguien usando producción y no me imagino lo que estarán pensando (o si? :D)

Yo de verdad no entiendo cómo se pueden llegar a estas fumadas... pero viendo quienes están en el poder, no me sorprende nada :D:D:D

Yo creo que esta vez no había nadie en producción. Se me plantea una duda y es que a mediados de este mes quieren sacar los servidores en producción, es decir en entorno real. Si es en real, las empresas que son de fuera de Bizkaia y son empresas de desarrollo no van a poder envíar a este entorno de producción, ya que su empresa no estará dada de alta en el sistema, o tendrán que esperar a mediados de noviembre para que saquen el nuevo entorno de pruebas.

Tendríamos que enviarles todos los días ficheros xml por email para que nos los revisen, como le han dicho al compañero. O poner una queja común para que esos servidores de prueba esten operativos antes.

Band 06-10-2021 09:23:42

Cita:

Empezado por keys (Mensaje 543375)
Yo creo que esta vez no había nadie en producción. Se me plantea una duda y es que a mediados de este mes quieren sacar los servidores en producción, es decir en entorno real. Si es en real, las empresas que son de fuera de Bizkaia y son empresas de desarrollo no van a poder envíar a este entorno de producción, ya que su empresa no estará dada de alta en el sistema, o tendrán que esperar a mediados de noviembre para que saquen el nuevo entorno de pruebas.

Tendríamos que enviarles todos los días ficheros xml por email para que nos los revisen, como le han dicho al compañero. O poner una queja común para que esos servidores de prueba esten operativos antes.


Si, será así a menos que a los de fuera como yo nos añadan al sistema, cosa que no creo que hagan.

Lo de enviar los ficheros xml por mail me parece una broma. Os imagináis 1000 correos diarios tirando muy bajo... como van a revisar eso más o menos pronto? No sirve que te contesten a los 2 días a ver si una simple prueba de un xml ha ido bien o mal.

Lo que me sorprende (bueno, viendo como van las cosas más bien ya no...) es que sabiendo como iban a proceder, que no hayan dejado un entorno de pruebas alternativo mientras hagan lo que tengan que hacer por otro lado.

En fin, que la fuerza nos acompañe a todos en esta entretenida aventura :D

keys 06-10-2021 09:31:36

Cita:

Empezado por Band (Mensaje 543376)
Si, será así a menos que a los de fuera como yo nos añadan al sistema, cosa que no creo que hagan.

Lo de enviar los ficheros xml por mail me parece una broma. Os imagináis 1000 correos diarios tirando muy bajo... como van a revisar eso más o menos pronto? No sirve que te contesten a los 2 días a ver si una simple prueba de un xml ha ido bien o mal.

Lo que me sorprende (bueno, viendo como van las cosas más bien ya no...) es que sabiendo como iban a proceder, que no hayan dejado un entorno de pruebas alternativo mientras hagan lo que tengan que hacer por otro lado.

En fin, que la fuerza nos acompañe a todos en esta entretenida aventura :D

Lo de enviar 1000 correos diarios lo digo para que se den cuenta de lo que estan haciendo. :D

Por eso digo si nos podemos poner de acuerdo las empresas desarrolladoras que estamos en este foro para enviar una queja conjunta a hacienda. O ir todos con antorchas y quemarles el chiringuito.

espinete 06-10-2021 11:10:26

1 Archivos Adjunto(s)
Cita:

Empezado por ermendalenda (Mensaje 543370)
En un xml si está un campo vacío es equivalente a poner <nombre de campo></nombredecanpo>
Que
</nombre de campo>
No he mirado si las especificaciones indican que mejor no ponerlo que ponerlo vacío en caso de no usar la serie.
Ya lo único que veo es que pongas un ejemplo de unxml firmado(cambiando datos sensibles) para que lo repasemos.

He probado a no incluir la Serie en la factura (si la factura no tiene serie), pero sigue igual.
Por lo tanto, el problema tiene que ser la codificación.

La factura SIN firmar está en UTF-8 SIN BOM. Al menos así me consta con el Notepad++ y con el RJ TextEd.
Y tiene esta línea al principio del XML:

Código:

    <?xml version="1.0" encoding="UTF-8"?>
La factura FIRMADA, también está en UTF-8 SIN BOM, pero la primera línea del XML es así:

Código:

    <?xml version="1.0"?>
Ambas tienen una línea de más en el fichero
Archivo Adjunto 3952

Este es el contenido del XML (SIN firmar):

<
Código:

?xml version="1.0" encoding="UTF-8"?>
<T:TicketBai
        xmlns:T="urn:ticketbai:emision"
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd">
        <Cabecera>
                <IDVersionTBAI>1.2</IDVersionTBAI>
        </Cabecera>
        <Sujetos>
                <Emisor>
                        <NIF>11111111H</NIF>
                        <ApellidosNombreRazonSocial>Empresa Emisora</ApellidosNombreRazonSocial>
                </Emisor>
                <Destinatarios>
                        <IDDestinatario>
                                <NIF>42187378L</NIF>
                                <ApellidosNombreRazonSocial>DESTINATARIO PEREZ</ApellidosNombreRazonSocial>
                                <CodigoPostal>28080</CodigoPostal>
                                <Direccion>Calle Madrid 18</Direccion>
                        </IDDestinatario>
                </Destinatarios>
                <VariosDestinatarios>N</VariosDestinatarios>
                <EmitidaPorTercerosODestinatario>N</EmitidaPorTercerosODestinatario>
        </Sujetos>
        <Factura>
                <CabeceraFactura>
                        <NumFactura>170</NumFactura>
                        <FechaExpedicionFactura>04-10-2021</FechaExpedicionFactura>
                        <HoraExpedicionFactura>10:38:20</HoraExpedicionFactura>
                        <FacturaSimplificada>N</FacturaSimplificada>
                        <FacturaEmitidaSustitucionSimplificada>N</FacturaEmitidaSustitucionSimplificada>
                </CabeceraFactura>
                <DatosFactura>
                        <FechaOperacion>04-10-2021</FechaOperacion>
                        <DescripcionFactura>Factura 170</DescripcionFactura>
                        <DetallesFactura>
                                <IDDetalleFactura>
                                        <DescripcionDetalle>Linea 1</DescripcionDetalle>
                                        <Cantidad>1</Cantidad>
                                        <ImporteUnitario>100</ImporteUnitario>
                                        <Descuento>0</Descuento>
                                        <ImporteTotal>121</ImporteTotal>
                                </IDDetalleFactura>
                        </DetallesFactura>
                        <ImporteTotalFactura>136.78</ImporteTotalFactura>
                        <RetencionSoportada>0</RetencionSoportada>
                        <Claves>
                                <IDClave>
                                        <ClaveRegimenIvaOpTrascendencia>01</ClaveRegimenIvaOpTrascendencia>
                                </IDClave>
                        </Claves>
                </DatosFactura>
                <TipoDesglose>
                        <DesgloseFactura>
                                <Sujeta>
                                        <NoExenta>
                                                <DetalleNoExenta>
                                                        <TipoNoExenta>S1</TipoNoExenta>
                                                        <DesgloseIVA>
                                                                <DetalleIVA>
                                                                        <BaseImponible>50.00</BaseImponible>
                                                                        <TipoImpositivo>0</TipoImpositivo>
                                                                        <CuotaImpuesto>0.00</CuotaImpuesto>
                                                                        <TipoRecargoEquivalencia>0</TipoRecargoEquivalencia>
                                                                        <CuotaRecargoEquivalencia>0</CuotaRecargoEquivalencia>
                                                                        <OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                                                                </DetalleIVA>
                                                        </DesgloseIVA>
                                                </DetalleNoExenta>
                                        </NoExenta>
                                </Sujeta>
                        </DesgloseFactura>
                </TipoDesglose>
        </Factura>
        <HuellaTBAI>
                <EncadenamientoFacturaAnterior>
                        <SerieFacturaAnterior></SerieFacturaAnterior>
                        <NumFacturaAnterior>169</NumFacturaAnterior>
                        <FechaExpedicionFacturaAnterior>04-10-2021</FechaExpedicionFacturaAnterior>
                        <SignatureValueFirmaFacturaAnterior>ihX0a1ouXku0n2MmeC47pcgwR2COanoSVPAcfKgxcIq90lrlk/0zmkqkBvX9Xus4dlms1P+q5IPIOQICaMD0OeXDR8EQ+lksbVE2</SignatureValueFirmaFacturaAnterior>
                </EncadenamientoFacturaAnterior>
                <Software>
                        <LicenciaTBAI>TBAIXXXXXXXXXXXXXXXX</LicenciaTBAI>
                        <EntidadDesarrolladora>
                                <NIF>11111111H</NIF>
                        </EntidadDesarrolladora>
                        <Nombre>Entidad Desarrolladora</Nombre>
                        <Version>15.5</Version>
                </Software>
                <NumSerieDispositivo>NSERIEPC</NumSerieDispositivo>
        </HuellaTBAI>
</T:TicketBai>


Neftali [Germán.Estévez] 06-10-2021 12:13:57

Sólo por si ayuda a aclarar el tema.
¿Por casualidad tienes en esa factura algún character extraño (ÑÇáéí,...)?
En la razón social del cliente, o en la empresa,...

ermendalenda 06-10-2021 12:31:57

Cita:

Empezado por espinete (Mensaje 543379)
He probado a no incluir la Serie en la factura (si la factura no tiene serie), pero sigue igual.
Por lo tanto, el problema tiene que ser la codificación.

La factura SIN firmar está en UTF-8 SIN BOM. Al menos así me consta con el Notepad++ y con el RJ TextEd.
Y tiene esta línea al principio del XML:

Código:

    <?xml version="1.0" encoding="UTF-8"?>
La factura FIRMADA, también está en UTF-8 SIN BOM, pero la primera línea del XML es así:

Código:

    <?xml version="1.0"?>
Ambas tienen una línea de más en el fichero
Archivo Adjunto 3952

Este es el contenido del XML (SIN firmar):

<
Código:

?xml version="1.0" encoding="UTF-8"?>
<T:TicketBai
    xmlns:T="urn:ticketbai:emision"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd">
    <Cabecera>
        <IDVersionTBAI>1.2</IDVersionTBAI>
    </Cabecera>
    <Sujetos>
        <Emisor>
            <NIF>11111111H</NIF>
            <ApellidosNombreRazonSocial>Empresa Emisora</ApellidosNombreRazonSocial>
        </Emisor>
        <Destinatarios>
            <IDDestinatario>
                <NIF>42187378L</NIF>
                <ApellidosNombreRazonSocial>DESTINATARIO PEREZ</ApellidosNombreRazonSocial>
                <CodigoPostal>28080</CodigoPostal>
                <Direccion>Calle Madrid 18</Direccion>
            </IDDestinatario>
        </Destinatarios>
        <VariosDestinatarios>N</VariosDestinatarios>
        <EmitidaPorTercerosODestinatario>N</EmitidaPorTercerosODestinatario>
    </Sujetos>
    <Factura>
        <CabeceraFactura>
            <NumFactura>170</NumFactura>
            <FechaExpedicionFactura>04-10-2021</FechaExpedicionFactura>
            <HoraExpedicionFactura>10:38:20</HoraExpedicionFactura>
            <FacturaSimplificada>N</FacturaSimplificada>
            <FacturaEmitidaSustitucionSimplificada>N</FacturaEmitidaSustitucionSimplificada>
        </CabeceraFactura>
        <DatosFactura>
            <FechaOperacion>04-10-2021</FechaOperacion>
            <DescripcionFactura>Factura 170</DescripcionFactura>
            <DetallesFactura>
                <IDDetalleFactura>
                    <DescripcionDetalle>Linea 1</DescripcionDetalle>
                    <Cantidad>1</Cantidad>
                    <ImporteUnitario>100</ImporteUnitario>
                    <Descuento>0</Descuento>
                    <ImporteTotal>121</ImporteTotal>
                </IDDetalleFactura>
            </DetallesFactura>
            <ImporteTotalFactura>136.78</ImporteTotalFactura>
            <RetencionSoportada>0</RetencionSoportada>
            <Claves>
                <IDClave>
                    <ClaveRegimenIvaOpTrascendencia>01</ClaveRegimenIvaOpTrascendencia>
                </IDClave>
            </Claves>
        </DatosFactura>
        <TipoDesglose>
            <DesgloseFactura>
                <Sujeta>
                    <NoExenta>
                        <DetalleNoExenta>
                            <TipoNoExenta>S1</TipoNoExenta>
                            <DesgloseIVA>
                                <DetalleIVA>
                                    <BaseImponible>50.00</BaseImponible>
                                    <TipoImpositivo>0</TipoImpositivo>
                                    <CuotaImpuesto>0.00</CuotaImpuesto>
                                    <TipoRecargoEquivalencia>0</TipoRecargoEquivalencia>
                                    <CuotaRecargoEquivalencia>0</CuotaRecargoEquivalencia>
                                    <OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                                </DetalleIVA>
                            </DesgloseIVA>
                        </DetalleNoExenta>
                    </NoExenta>
                </Sujeta>
            </DesgloseFactura>
        </TipoDesglose>
    </Factura>
    <HuellaTBAI>
        <EncadenamientoFacturaAnterior>
            <SerieFacturaAnterior></SerieFacturaAnterior>
            <NumFacturaAnterior>169</NumFacturaAnterior>
            <FechaExpedicionFacturaAnterior>04-10-2021</FechaExpedicionFacturaAnterior>
            <SignatureValueFirmaFacturaAnterior>ihX0a1ouXku0n2MmeC47pcgwR2COanoSVPAcfKgxcIq90lrlk/0zmkqkBvX9Xus4dlms1P+q5IPIOQICaMD0OeXDR8EQ+lksbVE2</SignatureValueFirmaFacturaAnterior>
        </EncadenamientoFacturaAnterior>
        <Software>
            <LicenciaTBAI>TBAIXXXXXXXXXXXXXXXX</LicenciaTBAI>
            <EntidadDesarrolladora>
                <NIF>11111111H</NIF>
            </EntidadDesarrolladora>
            <Nombre>Entidad Desarrolladora</Nombre>
            <Version>15.5</Version>
        </Software>
        <NumSerieDispositivo>NSERIEPC</NumSerieDispositivo>
    </HuellaTBAI>
</T:TicketBai>


Lo he copiado y he generado la firma correctamente, no parece que haya errores en el fichero sin firmar, lo he comprobado con chilkat despues de firmar:

Signature Verified
Number of Reference Digests = 3
Reference 1 digest is valid.
Reference 2 digest is valid.
Reference 3 digest is valid.


Lo que me extraña es que, a tí, despuéss de firmarlo le quite algo a la primera linea, con lo cual sigo pensando que hay un proceso intermedio que mete caracterers, a mi no me quita nada despues de firmarlo, con lo cual empieza a comprobar desde el proceso de Firma que es donde tienes el fallo.

espinete 06-10-2021 13:52:07

Cita:

Empezado por ermendalenda (Mensaje 543381)
Lo he copiado y he generado la firma correctamente, no parece que haya errores en el fichero sin firmar, lo he comprobado con chilkat despues de firmar:

Signature Verified
Number of Reference Digests = 3
Reference 1 digest is valid.
Reference 2 digest is valid.
Reference 3 digest is valid.


Lo que me extraña es que, a tí, despuéss de firmarlo le quite algo a la primera linea, con lo cual sigo pensando que hay un proceso intermedio que mete caracterers, a mi no me quita nada despues de firmarlo, con lo cual empieza a comprobar desde el proceso de Firma que es donde tienes el fallo.

Pues el proceso que hago ya lo he puesto por orden en el hilo varias veces. ¿Soy el único que usa los componentes de SecureBlackBox? ¿De verdad nadie que los use me puede decir qué línea me sobra o me falta?

1. Relleno los datos del "firmante":

Código Delphi [-]
firmante.r_Nombre_firma := empresa_cliente;
    firmante.r_ID := '';
    firmante.r_Metodo_Canonicalization := '';
    firmante.r_Hash_algorithm := 'SHA256';
    firmante.r_SigPolicyHashAlgorithm := 'SHA256';

    //Gipuzkoa
    firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';                            //https://www.gipuzkoa.eus/ticketbai/sinadura
    firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
    firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';

2. Firmo el archivo factura.xml, que estamos de acuerdo en que es correcto:

Código Delphi [-]
    FirmarXML('factura.xml',firmante);

3. Este es el código de FirmarXML() (sacado del foro, no me lo he inventado). Devuelve el archivo firmado.xml:

Código Delphi [-]
procedure FirmarXML(archivo : string; firmante : T_Firmante);
var
  CertificateStorage: TsbxCertificateStorage;  // Nuevo componente SecureBlackBox 2020
  CertificateManager: TsbxCertificateManager;
  sbxXAdESSigner1 : TsbxXAdESSigner;  // Nuevo componente SecureBlackBox 2020
  cert : TsbxCertificate;
  i : Integer;
  encontrado : Boolean;
begin
  sbxXAdESSigner1 := TsbxXAdESSigner.Create(nil);
  sbxXAdESSigner1.InputFile := archivo;
  sbxXAdESSigner1.OutputFile := 'firmado.xml';

  CertificateStorage := TsbxCertificateStorage.Create(nil);
  if CertificateStorage.Opened then
       CertificateStorage.Close(True);
  CertificateStorage.Open('system://currentuser@localhost/?store=MY');

  i := strtointdef(form1.AdvSmoothListBox1.Items.SelectedItem.Hint,-1);
  cert := CertificateStorage.Certificates[i];
  sbxXAdESSigner1.SigningCertificate := cert;
  FreeAndNil(CertificateStorage);

  sbxXAdESSigner1.SignatureType := cxstEnveloped;
  sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;
  sbxXAdESSigner1.HashAlgorithm := firmante.r_Hash_algorithm; 
  sbxXAdESSigner1.XMLElement := ''; 
  sbxXAdESSigner1.EnableXAdES := True;
  sbxXAdESSigner1.XAdESVersion := xav132;
  sbxXAdESSigner1.XAdESForm := xafEPES;
  sbxXAdESSigner1.Config('SigPolicyID=' + firmante.r_SigPolicyID); 
  sbxXAdESSigner1.Config('SigPolicyHash=' + firmante.r_SigPolicyHash); 
  sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=' + firmante.r_SigPolicyHashAlgorithm); 
  sbxXAdESSigner1.Config('SigPolicyURI=' + firmante.r_SigPolicyURI);

  try
    sbxXAdESSigner1.Sign();
  except
      MessageDlg('Error en el proceso de firma', mtError, [mbOK], 0);
  end;
end;

4. Estamos todos de acuerdo en que la firma es válida (según la url de verificación de chiklat y el otro que no recuerdo el nombre. puse los resultados hace días).
De hecho uno de ellos decía que NO había diferencia entre el original y el firmado.

Si NO hago nada más, el archivo firmado incluye la línea <?xml version="1.0" encoding="utf-8"?> (utf-8 en minúsculas. en el original está en mayúsculas).

¿Por qué? No lo sé, no soy yo quien diseñó los componentes de SecureBlackBox... Pero yo no hago NADA más.

5. El fichero generado tras la firma es UTF-8 PERO CON BOM. Para quitarle el p___ BOM hay que usar un código que alguien publicó al principio del hilo: SaveAsUTF8()

Lo hago así, tal como han dicho en el foro:

Código Delphi [-]
    xmldocument1.Active:=false;
    xmldocument1.LoadFromFile('firmado.xml');
    xmldocument1.Active:=true;

    SaveAsUTF8('firmado.xml', xmldocument1.XML);

Después de hacer eso, el fichero firmado ya es UTF-8 SIN BOM, PEEEEEERO, ahora la primera línea es "<?xml version="1.0"?>"

¿Por qué? No lo sé, yo ya he hecho tantas pruebas y cambios de codificaciones que no sé qué me falta por probar.

¿De verdad NADIE que utilice SecureBlackBox, que necesariamente ha estado leyendo el foro durante los últimos meses, y que muy probablemente ha seguido los mismos pasos que el resto, es capaz de, viendo el código, decirme QUÉ ESTOY HACIENDO MAL? ¿De verdad nadie?

Que no os estoy pidiendo el código fuente completo, hombre

ermendalenda 06-10-2021 14:01:34

Cita:

Empezado por espinete (Mensaje 543346)
Según chilkat:

Signature Verified
Number of Reference Digests = 2
Reference 1 digest is valid.
Reference 2 digest is valid.


Según el otro (con la opción que permite comparar el archivo SIN firmar y el firmado):

"El documento no ha sido modificado después de la firma"
"Certificado de CA confiable"

No está bien según chilkat
Tiene que tener 3 referencias válidas. Fíjate en la respuesta que te puesto de tu archivo firmado.
No uso SecureBlackBox, supongo que alguien que lea tu código te ayudará cuando vea el fallo.

keys 06-10-2021 14:10:05

Esta es la funcion que yo uso para firmar el fichero.
Código Delphi [-]
function p_firmar_xml(el_fichero : string; el_firmante : T_Firmante;MostrarError : boolean):boolean;
var
  CertificateStorage: TsbxCertificateStorage;  // Nuevo componente SecureBlackBox 2020
  sbxXAdESSigner1 : TsbxXAdESSigner;  // Nuevo componente SecureBlackBox 2020

  cert : TsbxCertificate;
  i : Integer;
  encontrado : Boolean;

begin
 result := false;
  if not FileExists(el_fichero) then
   begin
     Showmessage('No existe el fichero a firmar ', el_fichero);
     Exit;
   end;


  sbxXAdESSigner1 := TsbxXAdESSigner.Create(nil);
  sbxXAdESSigner1.RuntimeLicense := LicenciaSecureBlackBox;
  sbxXAdESSigner1.InputFile := el_fichero;
  sbxXAdESSigner1.OutputFile := el_fichero;
  CertificateStorage := TsbxCertificateStorage.Create(nil);

  CertificateStorage.RuntimeLicense := LicenciaSecureBlackBox;
  if CertificateStorage.Opened then
     CertificateStorage.Close(True);
  CertificateStorage.Open('system://currentuser@localhost/?store=MY');
  encontrado := False;
  for i := 0 to CertificateStorage.Certificates.Count - 1 do
  begin
    cert := CertificateStorage.Certificates[i];  
    if bintostr(cert.SerialNumber) = el_firmante.r_Nombre_firma then
     begin
       sbxXAdESSigner1.SigningCertificate := cert;
       encontrado := True;
       Break;
     end;
  end;


  if not Encontrado then
   begin //mostrar error
      showmessage('No se encuentra la firma');
      exit;
   end;

  sbxXAdESSigner1.SigningCertificate := cert;

  sbxXAdESSigner1.SignatureType := cxstEnveloped;

  sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;

  sbxXAdESSigner1.HashAlgorithm := el_firmante.r_Hash_algorithm;  // SHA256

  sbxXAdESSigner1.XMLElement := '';  // Todo el documento

  sbxXAdESSigner1.EnableXAdES := True;

  sbxXAdESSigner1.XAdESVersion := xav132;

  sbxXAdESSigner1.XAdESForm := xafEPES;
  sbxXAdESSigner1.Config('SigPolicyID=' + el_firmante.r_SigPolicyID); 
  sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=' + 'http://www.w3.org/2000/09/xmldsig#sha1'{el_firmante.r_SigPolicyHashAlgorithm}); 
  sbxXAdESSigner1.Config('SigPolicyURI=' + el_firmante.r_SigPolicyURI); 

  

  sbxXAdESSigner1.Config('SigPolicyHash=' + el_firmante.r_SigPolicyHash);
  sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=' + 'SHA256');

  try
    sbxXAdESSigner1.Sign();
    result := true;
  except
    on e : Exception do
     begin
       if MostrarError then
        Showmessage('Error en el proceso de firma' + e.Message);
     end;
  end;

  FreeAndNil(sbxXAdESSigner1);
  FreeAndNil(CertificateStorage);

end;

En el constructor de Elfirmante tengo esto para que se rellene segun la hacienda
Código Delphi [-]
constructor T_Firmante.Create(HAciend : SmallInt);
begin
  
 HAcienda := HAciend;

  case HAcienda of

    PROVALAVA : begin
                     r_SigPolicyID := 'https://ticketbai.araba.eus/tbai/sinadura/';
                     r_SigPolicyHash := '88E82F917EFFC8720345188FCBF2D84345149FB415F3FD750F50456ECF3232E4';
                     r_SigPolicyURI := 'https://ticketbai.araba.eus/tbai/sinadura/';
                  end;
    PROVGIPUZKOA : begin
                     r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
                     //r_SigPolicyHash := 'Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=';
                     r_SigPolicyHash := 'E8DACA026EB4A3BBBAD85510C3365EC36E2B6B6BDEF4F4506300B6D4033A227D';
                     r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
                   end;
    else
     begin
       r_SigPolicyID := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';
       r_SigPolicyHash := '42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B';
       r_SigPolicyURI := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';
     end;
  end;



  r_Hash_algorithm := 'SHA256';
  r_SigPolicyHashAlgorithm := 'SHA256';


end;

En el_firmante.r_Nombre_firma tengo el número de serie del certificado.

No te enfades hombre :)

espinete 06-10-2021 15:06:26

Cita:

Empezado por keys (Mensaje 543385)
No te enfades hombre :)

No es enfado. Es frustración, de verdad. Estoy con tres proyectos enormes al mismo tiempo y casi no he tenido tiempo para comer en los últimos 3 días.

Encima la próxima semana, supuestamente, Hacienda empezará a multar a empresas de software y clientes que utilicen software que permita realizar fraude y sin embargo no han especificado a qué se refieren exactamente o qué puede o no puede hacer el software, así que, aunque nuestro software no permita nada de eso, tenemos este tema en la cabeza y nos impide centrarnos.

Voy a probar con el código, pero juraría que no hay diferencias a simple vista.

¿Después de firmar, haces lo de SaveAsUTF8(), o no es necesario?

keys 06-10-2021 15:26:24

El fichero lo dejo tal cual sale de la función de firmar, ese es el xml definitivo.

Luego lo otra cosa es como enviarlo.

Eso si antes de firmar el documento pongo esto, es decir cuando lo guardo antes de firmalo.

Código Delphi [-]
 
         Documento.Version := '1.0';
         Documento.Encoding := 'UTF-8';
         Documento.StandAlone := 'no';

         if FileExists(ficheroTemporal) then
           System.SysUtils.DeleteFile(FicheroTemporal);

         Documento.SaveTofile(ficheroTemporal);


         Despues arreglo las cabeceras del fichero por que con delphi no las pone bien

y es el fichero temporal el que firmo.

Si te sirve de algo todos estamos igual. :rolleyes:

espinete 06-10-2021 15:51:38

Cita:

Empezado por keys (Mensaje 543385)
En el_firmante.r_Nombre_firma tengo el número de serie del certificado.

¿Pones eso porque hay que ponerlo, o por poner algo? Yo en mi caso pongo el nombre de la empresa "firmante".
Vamos, no creo que sea por esto.

El resto está igual, salvo detalles como estos:

El r_SigPolicyHash yo lo tenía en minúsculas, tu en mayúsculas.
firmante.r_ID ambos lo tenemos en blanco. O al menos en tu código no lo veo. No sé si realmente se utiliza.

En tu código, tienes esta línea 2 veces:

sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=.........

Primero con el valor http://www.w3.org/2000/09/xmldsig#sha1 y más adelante SHA256.

He añadido estas dos líneas, que yo no usaba, tras generar la factura (antes de firmarla):

xmldocument1.Version := '1.0';
XMLDocument1.StandAlone := 'no';

Tras cambiar las cabeceras, vuelvo a guardar el archivo así:

FicheroCorregir.WriteBOM := false;
FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);

¿Es esto necesario? De todas formas, estoy modificando el original (sin firmar), así que no creo que esto influya.

Yo uso dos ficheros: sin firmar y firmado, que tampoco creo que influya.


En cualquier caso... ahora me muestra otro error:

El fichero de alta TicketBAI no cumple el esquema XSD. No se ha podido procesar el mensaje. Detalle del error: Content is not allowed in prolog.

Resumiendo...
Si hago esto:

Código Delphi [-]
        XMLDocument1.XML.Text:=f.XML;
        xmldocument1.Active:=True;
        xmldocument1.Version := '1.0';
        XMLDocument1.Encoding:='UTF-8';
        XMLDocument1.StandAlone := 'no';

        if FileExists('factura.xml') then
           DeleteFile('factura.xml');

        xmldocument1.SaveToFile('factura.xml');

        FicheroCorregir := TStringList.Create;
        FicheroCorregir.LoadFromFile('factura.xml');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '','');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'', '');

        FicheroCorregir.WriteBOM := false;
        FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);

La factura (sin firmar) se guarda bien, con esta línea al principio...

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

...y supuestamente en UTF-8 SIN BOM, según veo en RJ TextEdit y Notepad++

Después, con tu código para la firma...

Código Delphi [-]
    firmante.r_Nombre_firma := empresa_cliente;
    firmante.r_ID := '';
    firmante.r_Metodo_Canonicalization := '';
    firmante.r_Hash_algorithm := 'SHA256';
    firmante.r_SigPolicyHashAlgorithm := 'SHA256';

    //Bizkaia
    if combobox1.ItemIndex=0 then
    begin
        firmante.r_SigPolicyID := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';                                   //https://ticketbai.eus/politicafirma
        firmante.r_SigPolicyHash := '42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B';    //Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es= convertido a HEX es 42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B
        firmante.r_SigPolicyURI := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';
    end
    else
    //Gipuzkoa
    if combobox1.ItemIndex=1 then
    begin
        firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';                            //https://www.gipuzkoa.eus/ticketbai/sinadura
        firmante.r_SigPolicyHash := 'E8DACA026EB4A3BBBAD85510C3365EC36E2B6B6BDEF4F4506300B6D4033A227D';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
        firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
    end
    else
    //Araba
    if combobox1.ItemIndex=2 then
    begin
        firmante.r_SigPolicyID := 'https://ticketbai.araba.eus/tbai/sinadura/';                            //https://www.gipuzkoa.eus/ticketbai/sinadura
        firmante.r_SigPolicyHash := '88E82F917EFFC8720345188FCBF2D84345149FB415F3FD750F50456ECF3232E4';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
        firmante.r_SigPolicyURI := 'https://ticketbai.araba.eus/tbai/sinadura/';
    end;

    //Método 2
    p_firmar_xml('factura.xml',firmante,true);


...y sin hacer nada más después, el fichero resultante ahora tiene BOM (según Notepad++ y RJ TextEdit) y esto en la primera línea:

<?xml version="1.0" encoding="utf-8" standalone="no"?> (con utf-8 ahora en minúsculas)

¿Conclusión? Suicidio

ermendalenda 06-10-2021 17:20:40

Cita:

Empezado por espinete (Mensaje 543390)
¿Pones eso porque hay que ponerlo, o por poner algo? Yo en mi caso pongo el nombre de la empresa "firmante".
Vamos, no creo que sea por esto.

El resto está igual, salvo detalles como estos:

El r_SigPolicyHash yo lo tenía en minúsculas, tu en mayúsculas.
firmante.r_ID ambos lo tenemos en blanco. O al menos en tu código no lo veo. No sé si realmente se utiliza.

En tu código, tienes esta línea 2 veces:

sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=.........

Primero con el valor http://www.w3.org/2000/09/xmldsig#sha1 y más adelante SHA256.

He añadido estas dos líneas, que yo no usaba, tras generar la factura (antes de firmarla):

xmldocument1.Version := '1.0';
XMLDocument1.StandAlone := 'no';

Tras cambiar las cabeceras, vuelvo a guardar el archivo así:

FicheroCorregir.WriteBOM := false;
FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);

¿Es esto necesario? De todas formas, estoy modificando el original (sin firmar), así que no creo que esto influya.

Yo uso dos ficheros: sin firmar y firmado, que tampoco creo que influya.


En cualquier caso... ahora me muestra otro error:

El fichero de alta TicketBAI no cumple el esquema XSD. No se ha podido procesar el mensaje. Detalle del error: Content is not allowed in prolog.

Resumiendo...
Si hago esto:

Código Delphi [-]
        XMLDocument1.XML.Text:=f.XML;
        xmldocument1.Active:=True;
        xmldocument1.Version := '1.0';
        XMLDocument1.Encoding:='UTF-8';
        XMLDocument1.StandAlone := 'no';

        if FileExists('factura.xml') then
           DeleteFile('factura.xml');

        xmldocument1.SaveToFile('factura.xml');

        FicheroCorregir := TStringList.Create;
        FicheroCorregir.LoadFromFile('factura.xml');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '','');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'', '');

        FicheroCorregir.WriteBOM := false;
        FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);

La factura (sin firmar) se guarda bien, con esta línea al principio...

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

...y supuestamente en UTF-8 SIN BOM, según veo en RJ TextEdit y Notepad++

Después, con tu código para la firma...

Código Delphi [-]
    firmante.r_Nombre_firma := empresa_cliente;
    firmante.r_ID := '';
    firmante.r_Metodo_Canonicalization := '';
    firmante.r_Hash_algorithm := 'SHA256';
    firmante.r_SigPolicyHashAlgorithm := 'SHA256';

    //Bizkaia
    if combobox1.ItemIndex=0 then
    begin
        firmante.r_SigPolicyID := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';                                   //https://ticketbai.eus/politicafirma
        firmante.r_SigPolicyHash := '42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B';    //Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es= convertido a HEX es 42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B
        firmante.r_SigPolicyURI := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';
    end
    else
    //Gipuzkoa
    if combobox1.ItemIndex=1 then
    begin
        firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';                            //https://www.gipuzkoa.eus/ticketbai/sinadura
        firmante.r_SigPolicyHash := 'E8DACA026EB4A3BBBAD85510C3365EC36E2B6B6BDEF4F4506300B6D4033A227D';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
        firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
    end
    else
    //Araba
    if combobox1.ItemIndex=2 then
    begin
        firmante.r_SigPolicyID := 'https://ticketbai.araba.eus/tbai/sinadura/';                            //https://www.gipuzkoa.eus/ticketbai/sinadura
        firmante.r_SigPolicyHash := '88E82F917EFFC8720345188FCBF2D84345149FB415F3FD750F50456ECF3232E4';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
        firmante.r_SigPolicyURI := 'https://ticketbai.araba.eus/tbai/sinadura/';
    end;

    //Método 2
    p_firmar_xml('factura.xml',firmante,true);


...y sin hacer nada más después, el fichero resultante ahora tiene BOM (según Notepad++ y RJ TextEdit) y esto en la primera línea:

<?xml version="1.0" encoding="utf-8" standalone="no"?> (con utf-8 ahora en minúsculas)

¿Conclusión? Suicidio

Digo yo. Por revisar otra cosa. A ver si has copiado cosas de la firma directamente del foro y en las variables de la firma tienes algún carácter(no visible). A mi me pasó una vez con el tema de t
Claves de tpvdatáfono

carlosMorell 06-10-2021 17:41:26

Buenas tardes,

algunas dudas, que supongo ya habéis resuelto, pero no la encuentro. Cuando genero el XML para su envió, se supone que han de ser almacenados en el equipo desde el que se ha generado la factura., por si se hace una revisión. O una vez transmitidos se pueden eliminar del equipo? Han de ser almacenados como fichero, o podría guardarlos en una tabla de la BD y reimprimirlos.

Algo similar se me plantea con las facturas. Solo se pueden generar una vez, y se han de almacenar. Sin tirar de la factura en base de datos para volver a generarlos ? O lo único es que no se puede alterar la información de la factura el la BD , pero puedo tirar de esa información para volver a imprimirlo, tantas veces como sea necesario?

Veo que son tres certificados, pero es tres en uno, o he de usar los tres certificados independientemente para firmar el XML?

Muchas gracias de antemano
Carlos.

tejano 06-10-2021 17:48:29

Buenas tardes,

Estoy intentado enviar/consultar datos con la Hacienda de Vizcaya y me da el mensaje de Error técnico (Servicio no disponible actualmente), os ha pasado a alguno más?

Lo estoy haciendo a través del nuevo link de la DBF

https://sarrerak.bizkaia.eus/N3B4000M/aurkezpena
https://sarrerak.bizkaia.eus/N3B4001M/kontsulta

Saludos

[485 bytes data]
* upload completely sent off: 485 out of 485 bytes
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed, 06 Oct 2021 15:44:24 GMT
< Server: JBoss-EAP/7
< Content-Encoding: gzip
< eus-bizkaia-n3-identificativo: 3275
< X-Powered-By: Undertow/1
< eus-bizkaia-n3-mensaje-respuesta: Error técnico. (Servicio no disponible actualmente)
< eus-bizkaia-n3-codigo-respuesta: B4_1000004
< eus-bizkaia-n3-numero-registro:
< eus-bizkaia-n3-tipo-respuesta: Incorrecto
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 0
<
100 485 0 0 100 485 0 370 0:00:01 0:00:01 --:--:-- 370
* Connection #0 to host sarrerak.bizkaia.eus left intact

iMia 06-10-2021 18:09:16

Cita:

Empezado por carlosMorell (Mensaje 543393)
Buenas tardes,

algunas dudas, que supongo ya habéis resuelto, pero no la encuentro. Cuando genero el XML para su envió, se supone que han de ser almacenados en el equipo desde el que se ha generado la factura., por si se hace una revisión. O una vez transmitidos se pueden eliminar del equipo? Han de ser almacenados como fichero, o podría guardarlos en una tabla de la BD y reimprimirlos.

Algo similar se me plantea con las facturas. Solo se pueden generar una vez, y se han de almacenar. Sin tirar de la factura en base de datos para volver a generarlos ? O lo único es que no se puede alterar la información de la factura el la BD , pero puedo tirar de esa información para volver a imprimirlo, tantas veces como sea necesario?

Veo que son tres certificados, pero es tres en uno, o he de usar los tres certificados independientemente para firmar el XML?

Muchas gracias de antemano
Carlos.

Cuando se generan los xmls para enviar, los puedes guardar en la maquina que los ha generado o en otro sitio, siempre y cuando sean accesibles por inspección en caso de haberla. No se pueden eliminar, almenos el xml firmado (yo personalmente guardo el que no está firmado y el firmado, así puedo ver si se ha intentado manipular de forma externa. (que hay mucho cliente con un "sobrino" que está "todo el dia con el ordenador y sabe mucho y es muuu listo"...)

El tema de las facturas en papel.. eso como tu veas... lo ideal es guardar la factura en PDF y reimprimirla... no regenerarla, ya que pueden pasar mil cosas al vovlver a regenerar...

El tema certificados nu sé... yo firmo con autofirma..

iMia 06-10-2021 18:11:13

Cita:

Empezado por tejano (Mensaje 543394)
Buenas tardes,

Estoy intentado enviar/consultar datos con la Hacienda de Vizcaya y me da el mensaje de Error técnico (Servicio no disponible actualmente), os ha pasado a alguno más?

Lo estoy haciendo a través del nuevo link de la DBF

https://sarrerak.bizkaia.eus/N3B4000M/aurkezpena
https://sarrerak.bizkaia.eus/N3B4001M/kontsulta

Saludos

[485 bytes data]
* upload completely sent off: 485 out of 485 bytes
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed, 06 Oct 2021 15:44:24 GMT
< Server: JBoss-EAP/7
< Content-Encoding: gzip
< eus-bizkaia-n3-identificativo: 3275
< X-Powered-By: Undertow/1
< eus-bizkaia-n3-mensaje-respuesta: Error técnico. (Servicio no disponible actualmente)
< eus-bizkaia-n3-codigo-respuesta: B4_1000004
< eus-bizkaia-n3-numero-registro:
< eus-bizkaia-n3-tipo-respuesta: Incorrecto
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 0
<
100 485 0 0 100 485 0 370 0:00:01 0:00:01 --:--:-- 370
* Connection #0 to host sarrerak.bizkaia.eus left intact


http://www.clubdelphi.com/foros/show...postcount=1721


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

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