¿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';
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'; firmante.r_SigPolicyHash := '42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B'; firmante.r_SigPolicyURI := 'https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf';
end
else
if combobox1.ItemIndex=1 then
begin
firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura'; firmante.r_SigPolicyHash := 'E8DACA026EB4A3BBBAD85510C3365EC36E2B6B6BDEF4F4506300B6D4033A227D'; firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
end
else
if combobox1.ItemIndex=2 then
begin
firmante.r_SigPolicyID := 'https://ticketbai.araba.eus/tbai/sinadura/'; firmante.r_SigPolicyHash := '88E82F917EFFC8720345188FCBF2D84345149FB415F3FD750F50456ECF3232E4'; firmante.r_SigPolicyURI := 'https://ticketbai.araba.eus/tbai/sinadura/';
end;
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