Ver Mensaje Individual
  #8  
Antiguo 10-07-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Reputación: 20
Galahad Va por buen camino
Cita:
Empezado por Galahad Ver Mensaje
vale, muchas gracias,, voy a revisar ese proyecto y adaptar esa función a ver si solucionamos el tema..
Hola, perdonad que moleste de nuevo con esto, pero es que no lo consigo.
He intentado adaptar el ejemplo de carga del proyecto 'Demo Verifactu DLL', pero como tengo delphi 12 y ese proyecto esta pensado para delphi 7 no coinciden algunas clases y no consigo adaptarlo.

por ejemplo en el proyecto de delphi 7 el evento webnodebeforepost esta declarado así:
Código Delphi [-]
procedure TEventosWebNode.WebNodeBeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
  pStore: HCERTSTORE;
  pCert: PCERT_CONTEXT;
  DataBlob: CRYPT_BIT_BLOB;
  PFX: TBytes;
  pass,cert:string;
begin
  if sesion=-1 then // viene de un validador de nif
  begin
      pass:=nifValidatorPass;
      cert:=nifValidator;
  end
  else     // viene de un objeto verifactu
  begin
      pass:=sesiones[sesion].inicio.passwordCertificado;
      cert:=sesiones[sesion].inicio.nombreCertificado;
  end;


  if (pos('.PFX',uppercase(cert))=0) and
     (pos('.P12',uppercase(cert))=0) then exit;


  cargaCertificado(data, cert, pass);
end;

y yo, en delphi 12 yo la utilizo asi:

Código Delphi [-]
procedure TEventosWebNode.WebNodeBeforePost(const HTTPReqResp: THTTPReqResp;
  Client: THTTPClient );
  //Data: Pointer);
var
  pStore: HCERTSTORE;
  pCert: PCERT_CONTEXT;
  DataBlob: CRYPT_BIT_BLOB;
  PFX: TBytes;
  pass,cert:string;
  puntero: pointer;
begin
  pass    :=  inicio.passwordCertificado;
  cert    :=  inicio.nombreCertificado;

  puntero :=  HTTPReqResp.ClientCertificate;// GetHTTPReqResp;
  if (pos('.PFX',uppercase(cert))=0) and
     (pos('.P12',uppercase(cert))=0) then exit;

  cargaCertificado(puntero, cert, pass);
end;

luego , la función cargacertificado aplico este codigo:
Código Delphi [-]
procedure cargaCertificado( Data:Pointer ; cert,pass:string);
var
  pStore: HCERTSTORE;
  pCert, currentcert: PCERT_CONTEXT;
  //DataBlob: CRYPT_BIT_BLOB;
  DataBlob:  CRYPT_DATA_BLOB;
  PFX: TBytes;
  certname:string;
begin
  pStore := nil;
  pCert := nil;

  PFX := TFile.ReadAllBytes( cert );
  try
    DataBlob.cbData := Length(PFX);
    DataBlob.pbData := @PFX[0];

    // Almacen temporal con el contenido del PFX
    pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), PKCS12_INCLUDE_EXTENDED_PROPERTIES or CRYPT_MACHINE_KEYSET );
    CheckError(pStore);

    // Buscar un certificado con clave privada
    // Solo debería haber uno
    pCert := CertFindCertificateInStore(pStore,
                                        X509_ASN_ENCODING,
                                        0,
                                        CERT_FIND_HAS_PRIVATE_KEY, //CERT_FIND_ANY,
                                        nil,
                                        nil);
    CheckError(pCert);

    // Pasarlo al servicio
    InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, pCert, SizeOf(CERT_CONTEXT));
    finally
    if Assigned(pCert) then
       CertFreeCertificateContext(pCert);

    if Assigned(pStore) then
      CertCloseStore(pStore, 0);
  end;

end;

Un saludo ...
Responder Con Cita