У меня есть веб-сайт IIS, который должен извлекать данные из стороннего веб-сервиса. Сайт является ISAPI dll, написанным в Delphi XE 10.2.
Веб-сервис создал самозаверяющий клиентский сертификат для использования. Я импортировал сертификат в магазин Local Machine. Корневой сертификат находится в доверенном корневом центре сертификации.
Веб-служба возвращает 403 Отказано в доступе.
Я создал автономного клиента вне IIS. Клиент работает как положено.
Я добавил код для явного добавления сертификата из файловой системы. Снова тестовый код работает, но ISAPI dll не может подключиться.
Вот код, который я использую для загрузки сертификата из файловой системы.
Data: Pointer);
var
HTTPRStore: IClientCertInfo;
hStore: HCERTSTORE;
CertContext: PCCERT_CONTEXT;
begin
HTTPReqResp.InvokeOptions:=[soPickFirstClientCertificate];
HTTPRStore:=HTTPReqResp as IClientCertInfo;
try
hStore := GetCertStore('C:\Certs\ClientDev.pfx', 'xxxx');
if Assigned(hStore) then
begin
CertContext :=
CertFindCertificateInStore(
hStore,
X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR,
PChar('ClientDev'),
nil
);
HTTPRStore.SetCertStore(hStore);
HTTPRStore.SetCertName(GetCertInfo(CertContext));
HTTPRStore.SetCertIssuer(GetCertInfo(CertContext, CERT_NAME_ISSUER_FLAG));
HTTPRStore.SetCertSerialNumber(GetCertSerialNumber(@CertContext.pCertInfo.SerialNumber));
TFile.AppendAllText('C:\inetpub\wwwroot\logs\test.log', HTTPRStore.GetCertName + #13#10);
CertFreeCertificateContext(CertContext);
end
else
raise Exception.Create('Cert store not open');
finally
HTTPRStore := nil;
end;
end;
Кто-нибудь знает, почему IIS не отправляет сертификат клиента?