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)

keys 22-07-2021 12:41:42

Cita:

Empezado por JoseLeeTo (Mensaje 542025)
Buenas!;

Hasta donde yo conozco, en Guipuzcoa sólamente existe la posibilidad de Alta de TicketBai, pero no así la modificación. ¿Esto es así?.
En los esquemas .XSD que exponen en su web, al menos hasta ayer, solo existen los de Alta y los de Anulación.

En cambio, recibí una notificación diciendo lo siguiente:

Desde la Subdirección General de Estrategia Tecnológica queremos invitarles a una sesión informativa dirigida a todas aquellas personas o entidades que estén desarrollando softwares garantes para cumplir con las nuevas obligaciones tributarias establecidas por las diputaciones forales.


Los temas que se tratarán en dicha sesión informativa son los siguientes:

1. Nuevo servicio Rest ZUZENDU para subsanar y modificar.
2. Listado de validaciones síncronas y asíncronas.
3. Claves del encadenamiento.
4. Recomendaciones para evitar errores y avisos.
5. Claves TicketBAI.
6. Certificados electrónicos.


Consideramos que los temas a tratar son de gran interés para el correcto desarrollo de sus respectivos softwares.



¿Alguien ha hecho o conoce algo al respecto?

Saludos y Gracias.

El jueves lo explicaran en la reunion.

Neftali [Germán.Estévez] 22-07-2021 12:53:23

Cita:

Empezado por Sistel (Mensaje 542018)

Batuz es TicketBAI + LROE.
Se retrasa la obligatoridad de Batuz por 2 años.
De todo Batuz: TicketBAI + LROE.
Batuz es sólo de Bizkaia.

Completando lo que dice [Sistel]:


Batuz = Fichero_TicketBAI [1..N] incrustado en LROE => Bizkaia
TicketBAI = Fichero_TicketBAI [1] => Guipuzkoa y Árava

Neftali [Germán.Estévez] 22-07-2021 12:58:06

Cita:

Empezado por JoseLeeTo (Mensaje 542025)
Hasta donde yo conozco, en Guipuzcoa sólamente existe la posibilidad de Alta de TicketBai, pero no así la modificación. ¿Esto es así?.

Pues alguien les habrá explicado que sólo con Alta(y rectficativas) + Anulación no es posible trabajar en las empresas (mira que tienen el SII por delante y no han aprendido nada o que son Vascos y pasan de todo) y a estas alturas han tenido que implementar la Modificación.

Tal como dice [keys] como es algo nuevo, se supone que en la reunión lo explicarán y publicarán los esquemas y ejemplos.

NOTA: Los más listos, los de Álava, que están esperando que los demás se den de cabezazos contra las paredes hasta que lo tengan claro y luego entrar ellos (al menos espero que aprovechen la "experiencia" de los ortros 2).

sEngine 22-07-2021 13:16:19

Esperemos que en Alava se inspiren en lo que tienen en Guipuzkoa, asi no habra que hacer muchos cambios

JoseLeeTo 22-07-2021 13:36:38

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 541972)
Aquí dice que comenzarán en octubre: https://www.naiz.eus/eu/info/noticia...r-este-octubre

Buenas;

He preguntado directamente a Álava sobre su implantación, y me reponden lo siguiente:

En la Disposición Transitoria Única se establece el calendario previsto de implantación que, conforme a lo dispuesto en el punto 3, la Diputada Foral de Hacienda, Finanzas y Presupuestos podrá modificar mediante la oportuna Orden Foral.

01/01/2022 voluntario
01/04/2022 asesorías
01/07/2022 actividades profesionales y farmacias
01/10/2022 el resto de contribuyentes


Saludos

jsanznub 22-07-2021 13:57:47

Cita:

Empezado por Eric Mtz (Mensaje 541966)
Ya digo, pregunta rápida, ¿Os furula Batuz?, no he cambiado nada y ahora me devuelve un:



Si os funciona, ¿me podríais compartir los tres parámetros que introducís en la firma?, no sea que hayan cambiado algo, éstos son los míos:



Gracias de antemano y recordad, somos uno con la fuerza y la fuerza está con nosotros.

Me pasa exactamente lo mismo que a ti y comparto los mismos parámetros. Les he preguntado directamente por el tema y la respuesta ha sido :

Las especificaciones indican que la firma debe ser de tipo EPES y en vuestro caso la firma que incluís es de tipo BES.

Hasta donde yo se la diferencia entre una firma BES y una EPES es justamente la introducción de la información contenida en esos parámetros. Sigo mirándolo, si encuentro algo lo compartiré por aquí.

Eric Mtz 22-07-2021 14:24:57

Cita:

Empezado por jsanznub (Mensaje 542036)
Me pasa exactamente lo mismo que a ti y comparto los mismos parámetros. Les he preguntado directamente por el tema y la respuesta ha sido :

Las especificaciones indican que la firma debe ser de tipo EPES y en vuestro caso la firma que incluís es de tipo BES.

Hasta donde yo se la diferencia entre una firma BES y una EPES es justamente la introducción de la información contenida en esos parámetros. Sigo mirándolo, si encuentro algo lo compartiré por aquí.

Estoy igual, pero en la respuesta de BATUZ hay algún dato que os puede resultar interesante así que os lo publico aquí:

Cita:

La validación de la firma ha estado deshabilitada durante un tiempo debido a pruebas internas que se han tenido que hacer, pero ya vuelve a estar habilitada. Es por eso que igual lo que antes no os daba error, ahora sí que os da.

El Hash correcto es el que indicaste: Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=

Por otro lado, las especificaciones indican que la firma debe ser de tipo EPES y en vuestro caso la firma que incluís es de tipo BES.

Las normas por las que se establece la política de firma en las tres Diputaciones forales son similares. Si comparáis las políticas de firma de las 3 Diputaciones veréis que existen ciertos campos en la identificación de la política de firma que son ligeramente diferentes, pero todos son igualmente válidos para las tres Diputaciones Forales. Tal y como se especifica en la Orden Foral 1482/2020 del 9 de Septiembre, existe la siguiente cláusula de reciprocidad:
Francamente no tengo ni la mas remota idea de la diferencia entre EPES y BES, pero me alegra no ser el único a que se le ha roto de un día para otro.

Bueno, recordad que estamos todos en formación testudo, dicho de otra manera somos una piña, si encuentro alguna solución os la podré por aquí, venga ánimo a todos.

Sistel 22-07-2021 16:08:41

Cita:

Empezado por sEngine (Mensaje 542033)
Esperemos que en Alava se inspiren en lo que tienen en Guipuzkoa, asi no habra que hacer muchos cambios

Si me permitís, me ha recordado el clásico chiste de vascos:

En una pelea de gallos es fácil distinguir a cada uno.
El de Bizkaia lleva un gallo.
El de Gipuzkoa lleva un pato.
Y el de Álava es el que apuesta por el pato.

Saludos y perdón por el inciso, pero no he podido aguantarme :D

sEngine 22-07-2021 16:32:40

Cita:

Empezado por Eric Mtz (Mensaje 542038)
Estoy igual, pero en la respuesta de BATUZ hay algún dato que os puede resultar interesante así que os lo publico aquí:



Francamente no tengo ni la mas remota idea de la diferencia entre EPES y BES, pero me alegra no ser el único a que se le ha roto de un día para otro.

Bueno, recordad que estamos todos en formación testudo, dicho de otra manera somos una piña, si encuentro alguna solución os la podré por aquí, venga ánimo a todos.

No se como lo teneis puesto pero yo lo tengo asi al crear la firma y me funciona (uso el autofirma). Teneis puesto lo de format?

Código Delphi [-]
sign -i "tempBai.xml" -o tempBai_firmado.xml ' +
'-store pkcs12:sello_entidad_act_prod.p12 -password IZProd2021 -filter sello_entidad_act_prod.p12 '+
'-format xades -xml -config "format=XAdES Enveloped ' +
'\npolicyIdentifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf '+
'\npolicyIdentifierHash=Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es='+
'\npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 ' +
'\npolicyQualifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';

y segun google

XAdES-BES. Forma básica que simplemente cumple los requisitos legales de la Directiva para firma electrónica avanzada
XAdES-EPES. Es un XAdES-BES al que se le incorpora información sobre la política de firma, como pudiera ser aquella información sobre el certificado empleado y la CA que lo emitió.

unomasmas 22-07-2021 22:12:35

Cita:

Empezado por skatologiko (Mensaje 541796)
A Guipuzcoa. Si envío un NIF español, sí que llega

<Destinatarios>
<IDDestinatario>
<NIF>NL855820627B01</NIF>
<ApellidosNombreRazonSocial>ITX MERKEN B.V.</ApellidosNombreRazonSocial>
</IDDestinatario>
</Destinatarios>

Y me da el siguiente error:
Error: El fichero de alta TicketBAI no cumple el esquema XSD. Detalle del error: cvc-pattern-valid: Value 'NL855820627B01' is not facet-valid with respect to pattern '(([a-z|A-Z]{1}\d{7}[a-z|A-Z]{1})|(\d{8}[a-z|A-Z]{1})|([a-z|A-Z]{1}\d{8}))' for type 'NIFType'.</Descripcion>


Ese NIF no es español. Creo que debes detallarlo así:
<Destinatarios>
<IDDestinatario>
<IDOtro>
<IDType>04 (o el que corresponda)</IDType>
<ID>NL855820627B01</ID>
</IDOtro>
<ApellidosNombreRazonSocial>ITX MERKEN B.V.</ApellidosNombreRazonSocial>
</IDDestinatario>
</Destinatarios>

Valores posibles para IDType:
02 NIF-IVA.
03 Pasaporte.
04 Documento oficial de identificación expedido por el país o territorio de residencia.
05 Certificado de residencia.
06 Otro documento probatorio.

unomasmas 22-07-2021 23:47:38

Enviar Alta a Gipuzkoa (en pruebas)
 
Tengo problemas para subir el fichero de alta TicketBAI al entorno de pruebas de Gipuzkoa. No entiendo muy bien qué está ocurriendo. Estoy haciendo el script en C#. En los diferentes métodos que he empleado me ocurren dos tipos de problema:

[Problema 1:]
Código:

        <ResultadosValidacion>
            <Codigo>002</Codigo>
            <Descripcion>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.</Descripcion>
            <Azalpena>Errorea: TicketBAI altako fitxategiak ez du betetzen XSD eskema. Mezua ezin da prozesatu. Errorearen xehetasuna: Content is not allowed in prolog.</Azalpena>
        </ResultadosValidacion>

Este es el código utilizado:
Código:

            string urlconexion = "h t t p s://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta";
            string file = @"D:\Datos_Desarrollo\tBAI\6936.XSIG";
            var client = new RestClient(urlconexion);
            client.ClientCertificates = new X509CertificateCollection() { certificate };
            var restrequest = new RestRequest(Method.POST);
            restrequest.AddHeader("Content-Type", "application/xml;charset=UTF-8");
            restrequest.AddFile("mifichero", file, "text/xml");
            IRestResponse response = client.Execute(restrequest);
            System.Diagnostics.Debug.WriteLine(response.Content);

RestClient y RestRequest son clases de RestSharp
IRestResponse es un contenedor de RestSharp que recoge la respuesta del servidor.
certificate es una instancia de la clase X509Certificate2 de System.Security.Cryptography.X509Certificates


[Problema 2:]
Código:

        <ResultadosValidacion>
            <Codigo>007</Codigo>
            <Descripcion>Error: Certificado remitente no válido para emisor factura.</Descripcion>
            <Azalpena>Errorea: Bidaltzailearen ziurtagiria ez da baliagarria fakturaren egilearentzat.</Azalpena>
        </ResultadosValidacion>

Este es el código utilizado:
Código:

            string urlconexion =  "h t t p s://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta";
            string file = @"D:\Datos_Desarrollo\tBAI\6936.XSIG";
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(urlconexion);
            wr.ContentType = "application/xml;charset=UTF-8";
            wr.Method = "POST";
            wr.ClientCertificates = new X509CertificateCollection() { certificate };
            Stream rs = wr.GetRequestStream();
            rs = wr.GetRequestStream();
            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            WebResponse wresp = null;
            try
            {
                wresp = wr.GetResponse();
                Stream stream2 = wresp.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                System.Diagnostics.Debug.WriteLine(reader2.ReadToEnd());
            }

HttpWebRequest se incluye en System.Net
certificate es igualmente una instancia de la clase X509Certificate2 de System.Security.Cryptography.X509Certificates
Me imagino que en este segundo caso el problema puede estar en la manipulación del fichero (por haberlo subido como stream) pero no veo cómo comprobarlo. Si alguien me pudiera echar una mano se lo agradecería tanto como el tiempo que llevo tratando de encontrar una solución (un mogollón). Gracias ya por haberme leido.

b4aronDeLaBirr4 23-07-2021 08:45:45

Buenas!

Yo también estoy desarrollando la solución en C# así que a ver si algo te puedo ayudar...
En primer lugar, si podrías postear el fichero XML que envías y que también me dijeras qué certificado estás usando. Cabe recordar que el orden de los elementos en el XML es importante que sea acorde al XSD y que la petición de alta al servicio la estés realizando con el certificado también (además de firmar con él), aunque veo que sí, podrías probar en POSTMAN previamente o algo. Yo hice esto para ir descartando estos errores, te lo recomiendo. Por cierto, cómo estás firmando el XML? (Esto ya porque a mí me interesa ver otras opciones jeje)

Un saludo.

Neftali [Germán.Estévez] 23-07-2021 08:51:32

Cita:

Empezado por unomasmas (Mensaje 542052)
... me ocurren dos tipos de problema:

<Descripcion>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.</Descripcion>

<Descripcion>Error: Certificado remitente no válido para emisor factura.</Descripcion>

Para el primero, ¿puedes poner el fichero que estás enviando?
Lo digo por compararlo con otros.
También puedes comprar tú mismo la estructura del que estás enviando con algunos de los ejemplos que hay en los mensajes del foro o los que te puedes descargar, a ver si te estás olvidando algún nodo (ya no sólo de los datos, sino de las firmas,...)

En cuanto al segundo, si revisas mensajes anteriores ya hemos hablado de él también. El certificado debe ser válido (de producción por decirelo así), no valen certificados de prueba.
¿Qué tipo de certificado estás utilizando?

También puedes escribirles un mail con el fichero que estás enviando y los errores que te dan; Para el primer caso te dirán qué te falta y para el segundo caso, te darán de alta el certificado (si es necesario) y lo asociarán a los datos que estás usando para el envío (NIF / RAZON SOCIAL).

Eric Mtz 23-07-2021 08:58:52

Cita:

Empezado por Sistel (Mensaje 542040)
Si me permitís, me ha recordado el clásico chiste de vascos:

En una pelea de gallos es fácil distinguir a cada uno.
El de Bizkaia lleva un gallo.
El de Gipuzkoa lleva un pato.
Y el de Álava es el que apuesta por el pato.

Saludos y perdón por el inciso, pero no he podido aguantarme :D

Me has hecho el día :D

JoseLeeTo 23-07-2021 11:12:30

Cita:

Empezado por unomasmas (Mensaje 542052)
Tengo problemas para subir el fichero de alta TicketBAI al entorno de pruebas de Gipuzkoa. No entiendo muy bien qué está ocurriendo. Estoy haciendo el script en C#. En los diferentes métodos que he empleado me ocurren dos tipos de problema:

[Problema 1:]
Código:

        <ResultadosValidacion>
            <Codigo>002</Codigo>
            <Descripcion>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.</Descripcion>
            <Azalpena>Errorea: TicketBAI altako fitxategiak ez du betetzen XSD eskema. Mezua ezin da prozesatu. Errorearen xehetasuna: Content is not allowed in prolog.</Azalpena>
        </ResultadosValidacion>

Este es el código utilizado:
Código:

            string urlconexion = "h t t p s://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta";
            string file = @"D:\Datos_Desarrollo\tBAI\6936.XSIG";
            var client = new RestClient(urlconexion);
            client.ClientCertificates = new X509CertificateCollection() { certificate };
            var restrequest = new RestRequest(Method.POST);
            restrequest.AddHeader("Content-Type", "application/xml;charset=UTF-8");
            restrequest.AddFile("mifichero", file, "text/xml");
            IRestResponse response = client.Execute(restrequest);
            System.Diagnostics.Debug.WriteLine(response.Content);

RestClient y RestRequest son clases de RestSharp
IRestResponse es un contenedor de RestSharp que recoge la respuesta del servidor.
certificate es una instancia de la clase X509Certificate2 de System.Security.Cryptography.X509Certificates


[Problema 2:]
Código:

        <ResultadosValidacion>
            <Codigo>007</Codigo>
            <Descripcion>Error: Certificado remitente no válido para emisor factura.</Descripcion>
            <Azalpena>Errorea: Bidaltzailearen ziurtagiria ez da baliagarria fakturaren egilearentzat.</Azalpena>
        </ResultadosValidacion>

Este es el código utilizado:
Código:

            string urlconexion =  "h t t p s://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta";
            string file = @"D:\Datos_Desarrollo\tBAI\6936.XSIG";
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(urlconexion);
            wr.ContentType = "application/xml;charset=UTF-8";
            wr.Method = "POST";
            wr.ClientCertificates = new X509CertificateCollection() { certificate };
            Stream rs = wr.GetRequestStream();
            rs = wr.GetRequestStream();
            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            WebResponse wresp = null;
            try
            {
                wresp = wr.GetResponse();
                Stream stream2 = wresp.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                System.Diagnostics.Debug.WriteLine(reader2.ReadToEnd());
            }

HttpWebRequest se incluye en System.Net
certificate es igualmente una instancia de la clase X509Certificate2 de System.Security.Cryptography.X509Certificates
Me imagino que en este segundo caso el problema puede estar en la manipulación del fichero (por haberlo subido como stream) pero no veo cómo comprobarlo. Si alguien me pudiera echar una mano se lo agradecería tanto como el tiempo que llevo tratando de encontrar una solución (un mogollón). Gracias ya por haberme leido.


Buenas. Yo también estoy con C#, aunque no utilizo RestSharp, sino HttpClient. En el caso del problema 2, tiene pinta de que el nombre del emisor de la factura, no coincide con el del certificado, y así tiene que ser.
El certificado tiene que ser el del propio obligado tributario, que tiene que coincidir con el emisor de la factura.

unomasmas 23-07-2021 11:24:46

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542054)
podrías postear el fichero XML que envías

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 542055)
¿puedes poner el fichero que estás enviando?

Es un poco tocho :-(. Ahí va. He cambiado/quitado algún dato para "anonimizarlo" pero la estructura se mantiene
Código:

<?xml version="1.0" encoding="utf-8"?>
<T:TicketBai xmlns:T="urn:ticketbai:emision">
  <Cabecera>
      <IDVersionTBAI>1.2</IDVersionTBAI>
  </Cabecera>
  <Sujetos>
      <Emisor>
        <NIF>xxxxxxxxx</NIF>
        <ApellidosNombreRazonSocial>Empresa para Desarrollo</ApellidosNombreRazonSocial>
      </Emisor>
      <Destinatarios>
        <IDDestinatario>
            <IDOtro>
              <CodigoPais>DE</CodigoPais>
              <IDType>03</IDType>
              <ID>U85XXXXX</ID>
            </IDOtro>
            <ApellidosNombreRazonSocial>CLIENTE</ApellidosNombreRazonSocial>
            <CodigoPostal>28036</CodigoPostal>
            <Direccion>C/ Inexistente. Madrid. ESP</Direccion>
        </IDDestinatario>
      </Destinatarios>
      <VariosDestinatarios>N</VariosDestinatarios>
      <EmitidaPorTercerosODestinatario>N</EmitidaPorTercerosODestinatario>
  </Sujetos>
  <Factura>
      <CabeceraFactura>
        <SerieFactura>2021-</SerieFactura>
        <NumFactura>0008</NumFactura>
        <FechaExpedicionFactura>27-05-2021</FechaExpedicionFactura>
        <HoraExpedicionFactura>00:00:00</HoraExpedicionFactura>
        <FacturaSimplificada>N</FacturaSimplificada>
        <FacturaEmitidaSustitucionSimplificada>N</FacturaEmitidaSustitucionSimplificada>
      </CabeceraFactura>
      <DatosFactura>
        <FechaOperacion>27-05-2021</FechaOperacion>
        <DescripcionFactura></DescripcionFactura>
        <DetallesFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Un servicio</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>2000.00000000</ImporteUnitario>
              <Descuento>0.00</Descuento>
              <ImporteTotal>2420.00</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 1</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>5.83710987</ImporteUnitario>
              <Descuento>1.17</Descuento>
              <ImporteTotal>5.65</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 2</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>2363.79000000</ImporteUnitario>
              <Descuento>756.41</Descuento>
              <ImporteTotal>1944.93</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 3 (Exento)</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>200.00000000</ImporteUnitario>
              <Descuento>0.00</Descuento>
              <ImporteTotal>200.00</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 4 (No sujeto)</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>400.00000000</ImporteUnitario>
              <Descuento>0.00</Descuento>
              <ImporteTotal>400.00</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 5</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>79.80172200</ImporteUnitario>
              <Descuento>15.96</Descuento>
              <ImporteTotal>77.25</ImporteTotal>
            </IDDetalleFactura>
        </DetallesFactura>
        <ImporteTotalFactura>4543.04</ImporteTotalFactura>
        <RetencionSoportada>0.00</RetencionSoportada>
        <Claves>
            <IDClave>
              <ClaveRegimenIvaOpTrascendencia>01</ClaveRegimenIvaOpTrascendencia>
            </IDClave>
        </Claves>
      </DatosFactura>
      <TipoDesglose>
        <DesgloseTipoOperacion>
            <PrestacionServicios>
              <Sujeta>
                  <NoExenta>
                    <DetalleNoExenta>
                          <TipoNoExenta>S1</TipoNoExenta>
                          <DesgloseIVA>
                              <DetalleIVA>
                                <BaseImponible>1800.00</BaseImponible>
                                <TipoImpositivo>21.00</TipoImpositivo>
                                <CuotaImpuesto>378.00</CuotaImpuesto>
                                <TipoRecargoEquivalencia>0.00</TipoRecargoEquivalencia>
                                <CuotaRecargoEquivalencia>0.00</CuotaRecargoEquivalencia>
                                <OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                              </DetalleIVA>
                          </DesgloseIVA>
                    </DetalleNoExenta>
                  </NoExenta>
              </Sujeta>
            </PrestacionServicios>
            <Entrega>
              <Sujeta>
                  <Exenta>
                    <DetalleExenta>
                        <CausaExencion>E1</CausaExencion>
                        <BaseImponible>180.00</BaseImponible>
                    </DetalleExenta>
                  </Exenta>
                  <NoExenta>
                    <DetalleNoExenta>
                          <TipoNoExenta>S1</TipoNoExenta>
                          <DesgloseIVA>
                              <DetalleIVA>
                                <BaseImponible>1508.30</BaseImponible>
                                <TipoImpositivo>21.00</TipoImpositivo>
                                <CuotaImpuesto>316.74</CuotaImpuesto>
                                <TipoRecargoEquivalencia>0.00</TipoRecargoEquivalencia>
                                <CuotaRecargoEquivalencia>0.00</CuotaRecargoEquivalencia>
                                <OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                              </DetalleIVA>
                          </DesgloseIVA>
                    </DetalleNoExenta>
                  </NoExenta>
              </Sujeta>
              <NoSujeta>
                  <DetalleNoSujeta>
                    <Causa>OT</Causa>
                    <Importe>360.00</Importe>
                  </DetalleNoSujeta>
              </NoSujeta>
            </Entrega>
        </DesgloseTipoOperacion>
      </TipoDesglose>
  </Factura>
  <HuellaTBAI>
      <EncadenamientoFacturaAnterior>
        <SerieFacturaAnterior>2021-</SerieFacturaAnterior>
        <NumFacturaAnterior>0007</NumFacturaAnterior>
        <FechaExpedicionFacturaAnterior>13-03-2021</FechaExpedicionFacturaAnterior>
        <SignatureValueFirmaFacturaAnterior>asdf</SignatureValueFirmaFacturaAnterior>
      </EncadenamientoFacturaAnterior>
      <Software>
      </Software>
  </HuellaTBAI>
<ds:Signature xmlns:ds="h t t p://w w w . w3.org/2000/09/xmldsig#" Id="Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="h t t p://w w w . w3.org/TR/2001/REC-xml-c14n-20010315" /><ds:SignatureMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmldsig-more#rsa-sha256" /><ds:Reference Id="Reference-1fd8f7a2-64b2-4853-be4d-6d09a5f4acf8" URI=""><ds:Transforms><ds:Transform Algorithm="h t t p://w w w . w3.org/2000/09/xmldsig#enveloped-signature" /></ds:Transforms><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>o1QqNl5sJpAl65C/BqAYVhusYNSi6ohFRmcOlj/XvS0=</ds:DigestValue></ds:Reference><ds:Reference Id="ReferenceKeyInfo" URI="#KeyInfoId-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>9Ot9CoT4axGDWrd2B2KUoiGUM9dotSbXN7VTW1ZSEzg=</ds:DigestValue></ds:Reference><ds:Reference Type="h t t p://uri.etsi.org/01903#SignedProperties" URI="#SignedProperties-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>ou5WE9zmPnbJIGd/8a1PdT8yjojsvnRHQL5mU/CUB6Y=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue Id="SignatureValue-de680881-c7b4-47c6-aba5-6587d516d7f8">ndpqqvNMKU7TLGzTuFaA34shuQMMV6D8i18U21wxr4uPVCOh79W6ws9Uaf/9v2xLeAJG0Xuxb7Tun5akz6v+lw/JthiulnG23G8No7FARMBi3/JvqPfWQT/3dZs/858JQRg5qOBSxy1UiXHrgHk8mwzAw8PqvmJX+Ah9RsBM9nHmvDW/Ezj+D6SgTinwUbe5AgxZ2FCubMpEf4BA0oBmkNgno4Gu62huvYYcm/XTfzuBgJsPWmF8Y2AB3YlMEZBqdZT7uSJYFoYLbku26UV8WQU9eQbErxFPI+3eiqqq+g0cKlq0mYmeQms9NAjWjJyOEYAZy6noD1OxghMzhsmbWw==</ds:SignatureValue><ds:KeyInfo Id="KeyInfoId-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:X509Data><ds:X509Certificate>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</ds:X509Certificate></ds:X509Data><ds:KeyValue><ds:RSAKeyValue><ds:Modulus>qqnHp05M8zTtA1mOGyn52Zg2MxIdVoq0i+nq1UBsyD0YTbDvrFxorop1lVmwD9zFcU7g97YYHzUh6ZKzrDBxRR5DuEj7ZWxmM8zdrUE4qj4RPaEn56yBspcfsXAnAElWhi8ZO6upkdwezKplh0sIv9rC3yVEmenUA+t3vpjvUjuVI83M8E2OmlO9wspX7oAagyG86X79QLoUCiMNaklhtts/bAhjaUf1NjiByA1oVJ/h5vPXRmjzIMSYOG4Nqx6oDS4EDjzodr9qWWR/rO/y8pAANFvhPviGC30oLEDU9QeImrYt9hLRHiI3Z3f+k8bthyY/NHw97LARgkl46UkQOQ==</ds:Modulus><ds:Exponent>AQAB</ds:Exponent></ds:RSAKeyValue></ds:KeyValue></ds:KeyInfo><ds:Object Id="XadesObjectId-57c1a5af-ffe1-461d-88df-f9eff65f7ae3"><xades:QualifyingProperties xmlns:xades="h t t p://uri.etsi.org/01903/v1.3.2#" Id="QualifyingProperties-1175f181-69af-4b92-89cd-01f8370fc991" Target="#Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><xades:SignedProperties Id="SignedProperties-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><xades:SignedSignatureProperties><xades:SigningTime>2021-07-22T07:25:38+02:00</xades:SigningTime><xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>4BZFYhzQCbqva/Vw8wyM2GXhf8lML3xaiMioujojtqQ=</ds:DigestValue></xades:CertDigest><xades:IssuerSerial><ds:X509IssuerName>CN=AC FNMT Usuarios, OU=Ceres, O=FNMT-RCM, C=ES</ds:X509IssuerName><ds:X509SerialNumber>348708523848XXXXXXXXXXXX13XX4566539550</ds:X509SerialNumber></xades:IssuerSerial></xades:Cert></xades:SigningCertificate><xades:SignaturePolicyIdentifier><xades:SignaturePolicyId><xades:SigPolicyId><xades:Identifier>h t t p://ticketbai.eus/politicafirma</xades:Identifier><xades:Description /></xades:SigPolicyId><xades:SigPolicyHash><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2000/09/xmldsig#sha1" /><ds:DigestValue>Ohixl6upD6av8N7pEvDABhEL6hM=</ds:DigestValue></xades:SigPolicyHash></xades:SignaturePolicyId></xades:SignaturePolicyIdentifier><xades:SignerRole><xades:ClaimedRoles><xades:ClaimedRole>emisor</xades:ClaimedRole><xades:ClaimedRole>sujeto</xades:ClaimedRole><xades:ClaimedRole>SERIALNUMBER</xades:ClaimedRole></xades:ClaimedRoles></xades:SignerRole></xades:SignedSignatureProperties><xades:SignedDataObjectProperties><xades:DataObjectFormat ObjectReference="#Reference-1fd8f7a2-64b2-4853-be4d-6d09a5f4acf8"><xades:MimeType>text/xml</xades:MimeType><xades:Encoding>UTF-8</xades:Encoding></xades:DataObjectFormat></xades:SignedDataObjectProperties></xades:SignedProperties></xades:QualifyingProperties></ds:Object></ds:Signature></T:TicketBai>

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542054)
qué certificado estás usando

Uso mi certificado personal, de la FNMT
Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542054)
el orden de los elementos en el XML es importante que sea acorde al XSD

Esto está revisado. Con la segunda opción me dió algunos errores de no concordancia con el XSD que corregí, así que aquí no creo que haya problema.
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 542055)
El certificado debe ser válido (de producción por decirelo así), no valen certificados de prueba. ¿Qué tipo de certificado estás utilizando?

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542054)
que la petición de alta al servicio la estés realizando con el certificado también (además de firmar con él)

Creo que aquí está el problema (para el segúndo método). Para el envío no usaba el certificado del alta en el servicio ¡Gracias!
Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542054)
podrías probar en POSTMAN previamente o algo. Yo hice esto para ir descartando estos errores, te lo recomiendo.

No lo he usado nunca. Le echaré un vistazo. Gracias.
Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542054)
Por cierto, cómo estás firmando el XML? (Esto ya porque a mí me interesa ver otras opciones jeje)

Lo firmo con la librería FirmaXadesNet del Ayuntamiento de Cartagena (h t t p s://w w w . administracionelectronica.gob.es/ctt/firmaxadesnet). No hay documentación para ella pero en el código fuente (que también puedes descargar) tienes ejemplos de uso. Si quieres probarla (si no la usas ya) y no te aclaras, puedo poner el borrador que tengo para la firma; es más: lo pongo ya:
Código:

        public void FirmaDoc()
        {
            XadesService xadesService = new XadesService();
            SignatureParameters parametros = new SignatureParameters();
            parametros.SignaturePolicyInfo = new SignaturePolicyInfo();
            parametros.SignaturePolicyInfo.PolicyIdentifier = "h t t p://ticketbai.eus/politicafirma";
            parametros.SignaturePolicyInfo.PolicyHash = "Ohixl6upD6av8N7pEvDABhEL6hM=";
            parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;
            parametros.DataFormat = new DataFormat();
            parametros.DataFormat.MimeType = "text/xml";
            parametros.SignerRole = new SignerRole();
            parametros.SignerRole.ClaimedRoles.Add("emisor");
            System.Security.Cryptography.X509Certificates.X509Certificate2 certificado;
            certificado = FirmaXadesNet.Utils.CertUtil.SelectCertificate();
            using (parametros.Signer = new Signer(certificado))
            {
                using (FileStream fs = new FileStream(_ficheroXml, FileMode.Open))
                {
                    SignatureDocument documentoFirma = xadesService.Sign(fs, parametros);
                    documentoFirma.Save(Path.Combine(Path.GetDirectoryName(_ficheroXml), Path.GetFileNameWithoutExtension(_ficheroXml) + ".XSIG"));
                    MessageBox.Show("Fichero guardado correctamente.");
                }
            }
        }

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 542055)
También puedes comprar tú mismo la estructura del que estás enviando con algunos de los ejemplos que hay en los mensajes del foro o los que te puedes descargar, a ver si te estás olvidando algún nodo (ya no sólo de los datos, sino de las firmas,...)

La verdad es que he mirado para ver si veía ejemplos (sobre todo de firmas) y no he visto nada más que algunas líneas sueltas... :-(
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 542055)
También puedes escribirles un mail con el fichero que estás enviando y los errores que te dan; Para el primer caso te dirán qué te falta y para el segundo caso, te darán de alta el certificado (si es necesario) y lo asociarán a los datos que estás usando para el envío (NIF / RAZON SOCIAL).

Gracias Neftalí. Voy a hacerlo también para ver si resuelvo el primer caso. El segundo con tus aportaciones y las de b4aronDeLaBirr4 creo que está resuelto. He hecho una subida tras cambiar el certificado de firma y ahora el error da pie a entender que ¡sí ha funcionado!. Este es el resultado:
Código:

        <ResultadosValidacion>
            <Codigo>005</Codigo>
            <Descripcion>Error: Fichero de alta TicketBAI ya registrado en el sistema.</Descripcion>
            <Azalpena>Errorea: TicketBAI fitxategia sisteman erregistratuta dago jada.</Azalpena>
        </ResultadosValidacion>

Probaré con otro documento y os cuento.

b4aronDeLaBirr4 23-07-2021 11:41:16

Firma XML
 
Cita:

Empezado por unomasmas (Mensaje 542059)
Es un poco tocho :-(. Ahí va. He cambiado/quitado algún dato para "anonimizarlo" pero la estructura se mantiene
Código:

<?xml version="1.0" encoding="utf-8"?>
<T:TicketBai xmlns:T="urn:ticketbai:emision">
  <Cabecera>
      <IDVersionTBAI>1.2</IDVersionTBAI>
  </Cabecera>
  <Sujetos>
      <Emisor>
        <NIF>xxxxxxxxx</NIF>
        <ApellidosNombreRazonSocial>Empresa para Desarrollo</ApellidosNombreRazonSocial>
      </Emisor>
      <Destinatarios>
        <IDDestinatario>
            <IDOtro>
              <CodigoPais>DE</CodigoPais>
              <IDType>03</IDType>
              <ID>U85XXXXX</ID>
            </IDOtro>
            <ApellidosNombreRazonSocial>CLIENTE</ApellidosNombreRazonSocial>
            <CodigoPostal>28036</CodigoPostal>
            <Direccion>C/ Inexistente. Madrid. ESP</Direccion>
        </IDDestinatario>
      </Destinatarios>
      <VariosDestinatarios>N</VariosDestinatarios>
      <EmitidaPorTercerosODestinatario>N</EmitidaPorTercerosODestinatario>
  </Sujetos>
  <Factura>
      <CabeceraFactura>
        <SerieFactura>2021-</SerieFactura>
        <NumFactura>0008</NumFactura>
        <FechaExpedicionFactura>27-05-2021</FechaExpedicionFactura>
        <HoraExpedicionFactura>00:00:00</HoraExpedicionFactura>
        <FacturaSimplificada>N</FacturaSimplificada>
        <FacturaEmitidaSustitucionSimplificada>N</FacturaEmitidaSustitucionSimplificada>
      </CabeceraFactura>
      <DatosFactura>
        <FechaOperacion>27-05-2021</FechaOperacion>
        <DescripcionFactura></DescripcionFactura>
        <DetallesFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Un servicio</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>2000.00000000</ImporteUnitario>
              <Descuento>0.00</Descuento>
              <ImporteTotal>2420.00</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 1</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>5.83710987</ImporteUnitario>
              <Descuento>1.17</Descuento>
              <ImporteTotal>5.65</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 2</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>2363.79000000</ImporteUnitario>
              <Descuento>756.41</Descuento>
              <ImporteTotal>1944.93</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 3 (Exento)</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>200.00000000</ImporteUnitario>
              <Descuento>0.00</Descuento>
              <ImporteTotal>200.00</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 4 (No sujeto)</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>400.00000000</ImporteUnitario>
              <Descuento>0.00</Descuento>
              <ImporteTotal>400.00</ImporteTotal>
            </IDDetalleFactura>
            <IDDetalleFactura>
              <DescripcionDetalle>Producto 5</DescripcionDetalle>
              <Cantidad>1.00</Cantidad>
              <ImporteUnitario>79.80172200</ImporteUnitario>
              <Descuento>15.96</Descuento>
              <ImporteTotal>77.25</ImporteTotal>
            </IDDetalleFactura>
        </DetallesFactura>
        <ImporteTotalFactura>4543.04</ImporteTotalFactura>
        <RetencionSoportada>0.00</RetencionSoportada>
        <Claves>
            <IDClave>
              <ClaveRegimenIvaOpTrascendencia>01</ClaveRegimenIvaOpTrascendencia>
            </IDClave>
        </Claves>
      </DatosFactura>
      <TipoDesglose>
        <DesgloseTipoOperacion>
            <PrestacionServicios>
              <Sujeta>
                  <NoExenta>
                    <DetalleNoExenta>
                          <TipoNoExenta>S1</TipoNoExenta>
                          <DesgloseIVA>
                              <DetalleIVA>
                                <BaseImponible>1800.00</BaseImponible>
                                <TipoImpositivo>21.00</TipoImpositivo>
                                <CuotaImpuesto>378.00</CuotaImpuesto>
                                <TipoRecargoEquivalencia>0.00</TipoRecargoEquivalencia>
                                <CuotaRecargoEquivalencia>0.00</CuotaRecargoEquivalencia>
                                <OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                              </DetalleIVA>
                          </DesgloseIVA>
                    </DetalleNoExenta>
                  </NoExenta>
              </Sujeta>
            </PrestacionServicios>
            <Entrega>
              <Sujeta>
                  <Exenta>
                    <DetalleExenta>
                        <CausaExencion>E1</CausaExencion>
                        <BaseImponible>180.00</BaseImponible>
                    </DetalleExenta>
                  </Exenta>
                  <NoExenta>
                    <DetalleNoExenta>
                          <TipoNoExenta>S1</TipoNoExenta>
                          <DesgloseIVA>
                              <DetalleIVA>
                                <BaseImponible>1508.30</BaseImponible>
                                <TipoImpositivo>21.00</TipoImpositivo>
                                <CuotaImpuesto>316.74</CuotaImpuesto>
                                <TipoRecargoEquivalencia>0.00</TipoRecargoEquivalencia>
                                <CuotaRecargoEquivalencia>0.00</CuotaRecargoEquivalencia>
                                <OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                              </DetalleIVA>
                          </DesgloseIVA>
                    </DetalleNoExenta>
                  </NoExenta>
              </Sujeta>
              <NoSujeta>
                  <DetalleNoSujeta>
                    <Causa>OT</Causa>
                    <Importe>360.00</Importe>
                  </DetalleNoSujeta>
              </NoSujeta>
            </Entrega>
        </DesgloseTipoOperacion>
      </TipoDesglose>
  </Factura>
  <HuellaTBAI>
      <EncadenamientoFacturaAnterior>
        <SerieFacturaAnterior>2021-</SerieFacturaAnterior>
        <NumFacturaAnterior>0007</NumFacturaAnterior>
        <FechaExpedicionFacturaAnterior>13-03-2021</FechaExpedicionFacturaAnterior>
        <SignatureValueFirmaFacturaAnterior>asdf</SignatureValueFirmaFacturaAnterior>
      </EncadenamientoFacturaAnterior>
      <Software>
      </Software>
  </HuellaTBAI>
<ds:Signature xmlns:ds="h t t p://w w w . w3.org/2000/09/xmldsig#" Id="Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="h t t p://w w w . w3.org/TR/2001/REC-xml-c14n-20010315" /><ds:SignatureMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmldsig-more#rsa-sha256" /><ds:Reference Id="Reference-1fd8f7a2-64b2-4853-be4d-6d09a5f4acf8" URI=""><ds:Transforms><ds:Transform Algorithm="h t t p://w w w . w3.org/2000/09/xmldsig#enveloped-signature" /></ds:Transforms><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>o1QqNl5sJpAl65C/BqAYVhusYNSi6ohFRmcOlj/XvS0=</ds:DigestValue></ds:Reference><ds:Reference Id="ReferenceKeyInfo" URI="#KeyInfoId-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>9Ot9CoT4axGDWrd2B2KUoiGUM9dotSbXN7VTW1ZSEzg=</ds:DigestValue></ds:Reference><ds:Reference Type="h t t p://uri.etsi.org/01903#SignedProperties" URI="#SignedProperties-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>ou5WE9zmPnbJIGd/8a1PdT8yjojsvnRHQL5mU/CUB6Y=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue Id="SignatureValue-de680881-c7b4-47c6-aba5-6587d516d7f8">ndpqqvNMKU7TLGzTuFaA34shuQMMV6D8i18U21wxr4uPVCOh79W6ws9Uaf/9v2xLeAJG0Xuxb7Tun5akz6v+lw/JthiulnG23G8No7FARMBi3/JvqPfWQT/3dZs/858JQRg5qOBSxy1UiXHrgHk8mwzAw8PqvmJX+Ah9RsBM9nHmvDW/Ezj+D6SgTinwUbe5AgxZ2FCubMpEf4BA0oBmkNgno4Gu62huvYYcm/XTfzuBgJsPWmF8Y2AB3YlMEZBqdZT7uSJYFoYLbku26UV8WQU9eQbErxFPI+3eiqqq+g0cKlq0mYmeQms9NAjWjJyOEYAZy6noD1OxghMzhsmbWw==</ds:SignatureValue><ds:KeyInfo Id="KeyInfoId-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><ds:X509Data><ds:X509Certificate>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</ds:X509Certificate></ds:X509Data><ds:KeyValue><ds:RSAKeyValue><ds:Modulus>qqnHp05M8zTtA1mOGyn52Zg2MxIdVoq0i+nq1UBsyD0YTbDvrFxorop1lVmwD9zFcU7g97YYHzUh6ZKzrDBxRR5DuEj7ZWxmM8zdrUE4qj4RPaEn56yBspcfsXAnAElWhi8ZO6upkdwezKplh0sIv9rC3yVEmenUA+t3vpjvUjuVI83M8E2OmlO9wspX7oAagyG86X79QLoUCiMNaklhtts/bAhjaUf1NjiByA1oVJ/h5vPXRmjzIMSYOG4Nqx6oDS4EDjzodr9qWWR/rO/y8pAANFvhPviGC30oLEDU9QeImrYt9hLRHiI3Z3f+k8bthyY/NHw97LARgkl46UkQOQ==</ds:Modulus><ds:Exponent>AQAB</ds:Exponent></ds:RSAKeyValue></ds:KeyValue></ds:KeyInfo><ds:Object Id="XadesObjectId-57c1a5af-ffe1-461d-88df-f9eff65f7ae3"><xades:QualifyingProperties xmlns:xades="h t t p://uri.etsi.org/01903/v1.3.2#" Id="QualifyingProperties-1175f181-69af-4b92-89cd-01f8370fc991" Target="#Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><xades:SignedProperties Id="SignedProperties-Signature-de680881-c7b4-47c6-aba5-6587d516d7f8"><xades:SignedSignatureProperties><xades:SigningTime>2021-07-22T07:25:38+02:00</xades:SigningTime><xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>4BZFYhzQCbqva/Vw8wyM2GXhf8lML3xaiMioujojtqQ=</ds:DigestValue></xades:CertDigest><xades:IssuerSerial><ds:X509IssuerName>CN=AC FNMT Usuarios, OU=Ceres, O=FNMT-RCM, C=ES</ds:X509IssuerName><ds:X509SerialNumber>348708523848XXXXXXXXXXXX13XX4566539550</ds:X509SerialNumber></xades:IssuerSerial></xades:Cert></xades:SigningCertificate><xades:SignaturePolicyIdentifier><xades:SignaturePolicyId><xades:SigPolicyId><xades:Identifier>h t t p://ticketbai.eus/politicafirma</xades:Identifier><xades:Description /></xades:SigPolicyId><xades:SigPolicyHash><ds:DigestMethod Algorithm="h t t p://w w w . w3.org/2000/09/xmldsig#sha1" /><ds:DigestValue>Ohixl6upD6av8N7pEvDABhEL6hM=</ds:DigestValue></xades:SigPolicyHash></xades:SignaturePolicyId></xades:SignaturePolicyIdentifier><xades:SignerRole><xades:ClaimedRoles><xades:ClaimedRole>emisor</xades:ClaimedRole><xades:ClaimedRole>sujeto</xades:ClaimedRole><xades:ClaimedRole>SERIALNUMBER</xades:ClaimedRole></xades:ClaimedRoles></xades:SignerRole></xades:SignedSignatureProperties><xades:SignedDataObjectProperties><xades:DataObjectFormat ObjectReference="#Reference-1fd8f7a2-64b2-4853-be4d-6d09a5f4acf8"><xades:MimeType>text/xml</xades:MimeType><xades:Encoding>UTF-8</xades:Encoding></xades:DataObjectFormat></xades:SignedDataObjectProperties></xades:SignedProperties></xades:QualifyingProperties></ds:Object></ds:Signature></T:TicketBai>

Uso mi certificado personal, de la FNMT
Esto está revisado. Con la segunda opción me dió algunos errores de no concordancia con el XSD que corregí, así que aquí no creo que haya problema.
Creo que aquí está el problema (para el segúndo método). Para el envío no usaba el certificado del alta en el servicio ¡Gracias!
No lo he usado nunca. Le echaré un vistazo. Gracias.
Lo firmo con la librería FirmaXadesNet del Ayuntamiento de Cartagena (h t t p s://w w w . administracionelectronica.gob.es/ctt/firmaxadesnet). No hay documentación para ella pero en el código fuente (que también puedes descargar) tienes ejemplos de uso. Si quieres probarla (si no la usas ya) y no te aclaras, puedo poner el borrador que tengo para la firma; es más: lo pongo ya:
Código:

        public void FirmaDoc()
        {
            XadesService xadesService = new XadesService();
            SignatureParameters parametros = new SignatureParameters();
            parametros.SignaturePolicyInfo = new SignaturePolicyInfo();
            parametros.SignaturePolicyInfo.PolicyIdentifier = "h t t p://ticketbai.eus/politicafirma";
            parametros.SignaturePolicyInfo.PolicyHash = "Ohixl6upD6av8N7pEvDABhEL6hM=";
            parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;
            parametros.DataFormat = new DataFormat();
            parametros.DataFormat.MimeType = "text/xml";
            parametros.SignerRole = new SignerRole();
            parametros.SignerRole.ClaimedRoles.Add("emisor");
            System.Security.Cryptography.X509Certificates.X509Certificate2 certificado;
            certificado = FirmaXadesNet.Utils.CertUtil.SelectCertificate();
            using (parametros.Signer = new Signer(certificado))
            {
                using (FileStream fs = new FileStream(_ficheroXml, FileMode.Open))
                {
                    SignatureDocument documentoFirma = xadesService.Sign(fs, parametros);
                    documentoFirma.Save(Path.Combine(Path.GetDirectoryName(_ficheroXml), Path.GetFileNameWithoutExtension(_ficheroXml) + ".XSIG"));
                    MessageBox.Show("Fichero guardado correctamente.");
                }
            }
        }

La verdad es que he mirado para ver si veía ejemplos (sobre todo de firmas) y no he visto nada más que algunas líneas sueltas... :-(
Gracias Neftalí. Voy a hacerlo también para ver si resuelvo el primer caso. El segundo con tus aportaciones y las de b4aronDeLaBirr4 creo que está resuelto. He hecho una subida tras cambiar el certificado de firma y ahora el error da pie a entender que ¡sí ha funcionado!. Este es el resultado:
Código:

        <ResultadosValidacion>
            <Codigo>005</Codigo>
            <Descripcion>Error: Fichero de alta TicketBAI ya registrado en el sistema.</Descripcion>
            <Azalpena>Errorea: TicketBAI fitxategia sisteman erregistratuta dago jada.</Azalpena>
        </ResultadosValidacion>

Probaré con otro documento y os cuento.

Gracias por la aportación, había probado con esta librería pero me generaba este error:

Código PHP:

Unable to cast object of type 'System.Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider'

Cómo cargas la librería? Por paquetes NuGet o cómo? Cualquier cosa que me puedas decir es de gran ayuda porque me gustaría hacer uso de esas librerías y no de Chilkat. Gracias!

unomasmas 23-07-2021 12:53:11

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 542060)
Gracias por la aportación, había probado con esta librería pero me generaba este error:

Código PHP:

Unable to cast object of type 'System.Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider'

Cómo cargas la librería? Por paquetes NuGet o cómo? Cualquier cosa que me puedas decir es de gran ayuda porque me gustaría hacer uso de esas librerías y no de Chilkat. Gracias!


No hice nada especial: Incluí la dll como referencia (directamente, sin NuGet) y también sus dependencias (BouncyCastle.Crypto y Microsoft.Xades) y simplemente con el método que pasé antes firma sin problemas. Es posible que tu librería no se corresponda con la versión .Net con la que apunta. Yo uso Net Framework 4.5 y la versión 2.1.0.0 de la librería.


Por lo demás, confirmo que con el cambio de certificado funcionó bien la subida. Sólo dió una advertencia pero la tienen documentada: "Factura recibida pero resultado indica: 010 posible error de encadenamiento. Si se trata de la primera factura enviada por un sistema de facturación, es normal recibir este mensaje. Si se produce este aviso solo en la primera factura, es correcto. Esa primera factura generará un aviso informativo relativo a posible encadenamiento incorrecto (esto es normal) y ya las facturas sucesivas ya no darán ningún aviso, al ir correctamente encadenadas. Si se produce en las facturas sucesivas, revisar que se encadena de acuerdo a las especificaciones"

b4aronDeLaBirr4 23-07-2021 13:14:18

Y ese dll me lo podrías pasar? o dejarme el enlace? Porque me imagino que te refieras a esta librería no?

Neftali [Germán.Estévez] 23-07-2021 13:24:14

Cita:

Empezado por unomasmas (Mensaje 542059)
Es un poco tocho :-(. Ahí va. He cambiado/quitado algún dato para "anonimizarlo" pero la estructura se mantiene


Así a primeras, echo en falta el bloque de <Software> que está vacío (tal vez porque lo has eliminado para que se vean los datos).
Cita:

<Software>
...
</Software>


La franja horaria es GMT +2. Ahora son las 12:10:52.

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