Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   General/Noticias (https://www.clubdelphi.com/foros/forumdisplay.php?f=64)
-   -   Uso del Certificado Digital en red (https://www.clubdelphi.com/foros/showthread.php?t=97596)

espinete 21-07-2025 17:49:02

Uso del Certificado Digital en red
 
Estamos pensando en facilitar al usuario final la configuración y el uso del certificado digital de su empresa, de forma que no tengan que instalarlo en todos los PCs de la red/empresa, sino que baste con tenerlo en el Servidor (que es quien hará los envíos a VeriFactu).

Pero me encuentro con un problema, y es que el componente HTTPRIO solo admite asignar el certificado desde el almacén de certificados de Windows (usando el nº de serie, etc.), no desde archivo pdf, cer, etc..

Ese componente lo uso además para la Validación de NIF de la AEAT, así que la cosa se me complica. He usado los componentes de SecureBlackbox para guardar el certificado en la BD y así poder reutilizarlo desde cualquier PC, pero tengo el problema del HTTPRIO, que no puedo asignarlo en tiempo real porque siempre necesitará que esté instalado en el almacén de Windows, y no en la BD o en un archivo externo.

¿Alguien ha dado con la solución? ¿O es imposible y se requiere que en todos los PCs esté instalado el certificado?

La verdad es que le facilitaría mucho las cosas al usuario final, pero bueno, si no hay manera, tampoco quiero volverme yo loco con tanta automatización. No creo que merezca la pena.

YellowStone 26-07-2025 14:24:10

Buenas:

HTTPRIO si permite cargar el certificado desde un fichero PFX que puedes tener en cualquier sitio de la red. Juraría que hay varios ejemplos aquí, al menos en el foro de Ticketbai.

Se trata de controlar el evento de HTTPRIO.HTTPWebNode.OnBeforePost.

Por ejemplo:

Código Delphi [-]
procedure TBeforeEx.OnBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  Cert         : ICertificate2;
  CertContext  : ICertContext;
  PCertContext : PCCERT_CONTEXT;
  FTimeout: Cardinal;
begin
  FTimeout := 12000;

  InternetSetOption(Data, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FTimeout), SizeOf(FTimeout));
  InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FTimeout), SizeOf(FTimeout));
  InternetSetOption(Data, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FTimeout), SizeOf(FTimeout));

  Cert := CoCertificate.Create;
  try
    Cert.Load(FicheroCert, ClaveCert, CAPICOM_KEY_STORAGE_EXPORTABLE, CAPICOM_LOCAL_MACHINE_KEY);
    if cert.ValidToDate < date then
      begin
        MessageDlg('O Certificado Digital '+trim(FicheroCert)+' está caducado.', mtWarning, [mbOk], 0);
      end;
    CertContext := Cert as ICertContext;
    CertContext.Get_CertContext( Integer( PCertContext ) );
    //Insertamos en el XML la identificación del certificado
    // INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84
    // En Delphi 2007 no existe esta constante en WinInet.
    if InternetSetOption( Data, 84, PCertContext, Sizeof( CERT_CONTEXT )) = False then
      begin
        MessageDlg('Error anexando el Certificado Digital.', mtError, [mbOk], 0);
      end;
  except
    on E: Exception do
      begin
        MessageDlg('Error cargado el Certificado Digital:'+#13#10+#13#10+E.Message, mtError, [mbOk], 0);
      end;
  end;

end;

Así lo usamos en Delphi 2007, así que supongo que en versiones posteriores será más fácil.

Luego hay algunos tipos de certificados, que dependiendo de la entidad certificadora, tendrás que buscar el correcto dentro de cada pfx, por ejemplo los de IANATACA, en los de la FNMT no.


La franja horaria es GMT +2. Ahora son las 11:27:04.

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