Использовать сертификат клиента от IIS - PullRequest
0 голосов
/ 07 июня 2019

У меня есть веб-сайт 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 не отправляет сертификат клиента?

...