Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
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.
Responder Con Cita
  #2  
Antiguo 05-10-2021
Ramon88 Ramon88 is offline
Miembro
 
Registrado: ago 2021
Posts: 157
Poder: 6
Ramon88 Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
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.

Última edición por Ramon88 fecha: 05-10-2021 a las 17:54:19.
Responder Con Cita
  #3  
Antiguo 05-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
Cita:
Empezado por Ramon88 Ver Mensaje
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.
Responder Con Cita
  #4  
Antiguo 05-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
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.
Responder Con Cita
  #5  
Antiguo 06-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
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.
Responder Con Cita
  #6  
Antiguo 06-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
Cita:
Empezado por ermendalenda Ver Mensaje
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
img.jpg

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>

Última edición por Neftali [Germán.Estévez] fecha: 06-10-2021 a las 13:12:42.
Responder Con Cita
  #7  
Antiguo 06-10-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.503
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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,...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 06-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
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.

Última edición por ermendalenda fecha: 06-10-2021 a las 13:35:31.
Responder Con Cita
  #9  
Antiguo 06-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
Cita:
Empezado por ermendalenda Ver Mensaje
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
Responder Con Cita
  #10  
Antiguo 05-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
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 :=...
Responder Con Cita
  #11  
Antiguo 05-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
Cita:
Empezado por ermendalenda Ver Mensaje
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;
Responder Con Cita
  #12  
Antiguo 05-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
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.
Responder Con Cita
  #13  
Antiguo 07-10-2021
carlosMorell carlosMorell is offline
Registrado
 
Registrado: ago 2021
Posts: 7
Poder: 0
carlosMorell Va por buen camino
La firma o las firmas

Una duda sobe la firma o las firmas.

Se supone que hay tres firmas, la de aplicación, la de usuario y la de dispositivo. No termina de cuadrarme esto, pero por lo que he leido es asi. Y que supongo que esto se puede hacer desasistido... o cada vez que emita una factura, he de seleccionar el certificado de la lista de certificados y firmar el xml?

Pero ahora, como incorporo las 3 firmas? o ha de ser una de las tres ? o una que contempla las tres? O es que el software garante ya esta certificado, y se da por supuesto que esa firma esta incluida al usar ese software? Perdón por mis preguntas ya obsoletas... Que veo que andais ya todos en otros pasos del proceso.

Supuestamente con Chilkat se podría automatizar todo esto... y hacerlo de forma desasistida, no?

Tengo que integrarlo en una aplicación desarrollada en Velneo6, que no permite hacer firmas. Alguien tiene el mismo problema? estoy pensando en hacerlo bajo php, o python.o c++ para que sea un .exe que se ejecute desde Velneo... O lo suyo seria una dll.

Gracias!
Responder Con Cita
  #14  
Antiguo 07-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
Hasta ahora yo solo he utilizado dos firmas (usando el mismo certificado, en mi caso)

- Firmar la factura
- Firmar el envío

No sé hasta qué punto hay que certificar el dispositivo... ¿Y si es un software alojado en la nube, por ejemplo, en Azure? Qué se utiliza en ese caso?

Cuál sería el "dispositivo" en ese caso, teniendo en cuenta que en Azure, Google Cloud, AWS, etc. puede haber réplicas exactas de la misma aplicación según el volumen de carga?
Responder Con Cita
  #15  
Antiguo 07-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por carlosMorell Ver Mensaje
Una duda sobe la firma o las firmas.

Se supone que hay tres firmas, la de aplicación, la de usuario y la de dispositivo. No termina de cuadrarme esto, pero por lo que he leido es asi. Y que supongo que esto se puede hacer desasistido... o cada vez que emita una factura, he de seleccionar el certificado de la lista de certificados y firmar el xml?

Pero ahora, como incorporo las 3 firmas? o ha de ser una de las tres ? o una que contempla las tres? O es que el software garante ya esta certificado, y se da por supuesto que esa firma esta incluida al usar ese software? Perdón por mis preguntas ya obsoletas... Que veo que andais ya todos en otros pasos del proceso.

Supuestamente con Chilkat se podría automatizar todo esto... y hacerlo de forma desasistida, no?

Tengo que integrarlo en una aplicación desarrollada en Velneo6, que no permite hacer firmas. Alguien tiene el mismo problema? estoy pensando en hacerlo bajo php, o python.o c++ para que sea un .exe que se ejecute desde Velneo... O lo suyo seria una dll.

Gracias!
Tema firnas
T
Consigue un certificado de firma (o de autónomo o de dispositivo o de lo que sea) con su clave.
Aún puedes hacer pruebas sin dar dte alta en software grnté(solo es a una clave que te Dan la forales por rellenar un formulario de compromiso de que el software cumple) este para las pruebas aún no te hace falta. Y con la clave que te den la tienes que escribir en el xml en un campo específico, de momento pon cualquier cosa.
Firmar el software (si es una distribución de escritorio(que se instala en un equipo y no se ejecutaen la web o similar) tienes que firmarlo, pero eso no tiene que incluirse en lo que envías. Cada nueva versión tienes que guardar la copia y volver a firmar. (para las pruebas tampoco te hace falta).
Pribldma que tu software no puede firmar:
Aquí cada uno ha hecho cosas distintas en la medida de lo que conoce, facilidad, costes.ll más adaptable a lo que tengas etcc.
Ejemplo usar el firmador.pho que desarrollo un usuario y ejecutarlo con algún servidor php instalado en cualquier sitio. Por ejemplo un servidor XAMPP..
Ejemplo 2, usar librerías que tiene un coste, te facilitan que lo puedes integrar con un montón de softwares, Chilkat, etc.. Usar el firmador de Autofirmacommanline. Exe.
No te preocupes si tu software no puede firmar o enviar. Te recomie do que te relee as todo el hilo (todas la s páginas) que al principio es un poco lío pero lte va a despejar todas las dudas.
Para enviar puedes usar el software de distribución gratuita CURL.
Responder Con Cita
  #16  
Antiguo 08-10-2021
carlosMorell carlosMorell is offline
Registrado
 
Registrado: ago 2021
Posts: 7
Poder: 0
carlosMorell Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Tema firnas
T
Consigue un certificado de firma (o de autónomo o de dispositivo o de lo que sea) con su clave.
Aún puedes hacer pruebas sin dar dte alta en software grnté(solo es a una clave que te Dan la forales por rellenar un formulario de compromiso de que el software cumple) este para las pruebas aún no te hace falta. Y con la clave que te den la tienes que escribir en el xml en un campo específico, de momento pon cualquier cosa.
Firmar el software (si es una distribución de escritorio(que se instala en un equipo y no se ejecutaen la web o similar) tienes que firmarlo, pero eso no tiene que incluirse en lo que envías. Cada nueva versión tienes que guardar la copia y volver a firmar. (para las pruebas tampoco te hace falta).
Problema que tu software no puede firmar:
Aquí cada uno ha hecho cosas distintas en la medida de lo que conoce, facilidad, costes.ll más adaptable a lo que tengas etcc.
Ejemplo usar el firmador.pho que desarrollo un usuario y ejecutarlo con algún servidor php instalado en cualquier sitio. Por ejemplo un servidor XAMPP..
Ejemplo 2, usar librerías que tiene un coste, te facilitan que lo puedes integrar con un montón de softwares, Chilkat, etc.. Usar el firmador de Autofirmacommanline. Exe.
No te preocupes si tu software no puede firmar o enviar. Te recomie do que te relee as todo el hilo (todas la s páginas) que al principio es un poco lío pero lte va a despejar todas las dudas.
Para enviar puedes usar el software de distribución gratuita CURL.
Buenos días,

muchas gracias por tu respuesta. Si que había pensado una solución basada en php, o quizás hago una dll en C++ para que sea todo mas rápido. La duda que me queda, es si es posible automatizarlo tanto que no sea necesario que el usuario seleccione el certificado del almacén. Y si el certificado de dispositivo y de entidad empresarial pueden ser el mismo. Es decir, es uno de los dos, no los dos certificados simultáneamente. Que la documentación al respecto es muy confusa.

Gracias de antemano
Carlos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice newtron Internet 3716 19-01-2026 21:01:34
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 10:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 17:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 10:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 10:21:14


La franja horaria es GMT +2. Ahora son las 20:34:38.


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
Copyright 1996-2007 Club Delphi