Cita:
Empezado por Galahad
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 begin
pass:=nifValidatorPass;
cert:=nifValidator;
end
else 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 );
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; 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_DATA_BLOB;
PFX: TBytes;
certname:string;
begin
pStore := nil;
pCert := nil;
PFX := TFile.ReadAllBytes( cert );
try
DataBlob.cbData := Length(PFX);
DataBlob.pbData := @PFX[0];
pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), PKCS12_INCLUDE_EXTENDED_PROPERTIES or CRYPT_MACHINE_KEYSET );
CheckError(pStore);
pCert := CertFindCertificateInStore(pStore,
X509_ASN_ENCODING,
0,
CERT_FIND_HAS_PRIVATE_KEY, nil,
nil);
CheckError(pCert);
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 ...