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; sbxXAdESSigner1 : TsbxXAdESSigner;
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 showmessage('No se encuentra la firma');
exit;
end;
sbxXAdESSigner1.SigningCertificate := cert;
sbxXAdESSigner1.SignatureType := cxstEnveloped;
sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;
sbxXAdESSigner1.HashAlgorithm := el_firmante.r_Hash_algorithm;
sbxXAdESSigner1.XMLElement := '';
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');
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 := '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
