Lo revisé un poco y aquí te dejo una versión probada en Delphi 2010 usando sólo la unidad CertHelper que ya viene de serie.
Código Delphi
[-]
uses
CertHelper, WinInet;
function PFXImportCertStore(var pPFX: CRYPT_BIT_BLOB;
szPassword: LPCWSTR;
dwFlags: DWORD): HCERTSTORE; stdcall; external 'Crypt32.dll';
procedure TformMain.HTTPRIO1HTTPWebNode1BeforePost(
const HTTPReqResp: THTTPReqResp; Data: Pointer);
procedure CheckError(Puntero: Pointer);
begin
if not Assigned(Puntero) then
RaiseLastOSError;
end;
const
INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
PKCS12_INCLUDE_EXTENDED_PROPERTIES = $0010;
CERT_COMPARE_HAS_PRIVATE_KEY = 21;
CERT_FIND_HAS_PRIVATE_KEY = CERT_COMPARE_HAS_PRIVATE_KEY shl CERT_COMPARE_SHIFT;
Pass = 'LaContraseña';
var
pStore: HCERTSTORE;
pCert: PCERT_CONTEXT;
DataBlob: CRYPT_BIT_BLOB;
PFX: TBytes;
begin
pStore := nil;
pCert := nil;
PFX := TFile.ReadAllBytes('ArchivoDelCertificado.PFX');
try
DataBlob.cbData := Length(PFX);
DataBlob.pbData := @PFX[0];
pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), PKCS12_INCLUDE_EXTENDED_PROPERTIES);
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;