Ver Mensaje Individual
  #1792  
Antiguo 06-10-2021
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.130
Reputación: 23
keys Va por buen camino
Esta es la funcion que yo uso para firmar el fichero.
Código Delphi [-]
function p_firmar_xml(el_fichero : string; el_firmante : T_Firmante;MostrarError : boolean):boolean;
var
  CertificateStorage: TsbxCertificateStorage;  // Nuevo componente SecureBlackBox 2020
  sbxXAdESSigner1 : TsbxXAdESSigner;  // Nuevo componente SecureBlackBox 2020

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

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


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

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


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

  sbxXAdESSigner1.SigningCertificate := cert;

  sbxXAdESSigner1.SignatureType := cxstEnveloped;

  sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;

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

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

  sbxXAdESSigner1.EnableXAdES := True;

  sbxXAdESSigner1.XAdESVersion := xav132;

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

  

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

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

  FreeAndNil(sbxXAdESSigner1);
  FreeAndNil(CertificateStorage);

end;

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

  case HAcienda of

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



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


end;

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

No te enfades hombre
Responder Con Cita