При работе с веб-сервисами в среде Delphi XE7 на операционной системе Windows 8.1 пользователь может столкнуться с проблемой, связанной с аутентификацией клиента. В частности, при попытке обращения к веб-сервису https://wsp.hom.orizonbrasil.com.br:6214/tiss/v30200/tissSolicitacaoProcedimento в Delphi XE7 возникает исключение с сообщением о том, что для завершения аутентификации клиента требуется сертификат.
Причина проблемы
Проблема заключается в том, что компонент THttpRio, использующий WinInet, не может автоматически найти необходимый сертификат в хранилище ROOT сертификатов системы. По умолчанию THttpRio ищет сертификаты в хранилище MY для текущего пользователя, но в данном случае сертификат находится в ROOT хранилище.
Решение проблемы
Для решения проблемы необходимо использовать обработчик события OnBeforePost компонента THttpRio, чтобы указать ему использовать ROOT хранилище сертификатов. В этом случае сертификат будет найден и использован для аутентификации. Вот пример кода, который можно использовать для решения проблемы:
procedure Form1.OnBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
HTTPRStore: IClientCertInfo;
hStore: pointer;
Flags: Cardinal;
begin
HTTPReqResp.InvokeOptions := [soPickFirstClientCertificate, soIgnoreInvalidCerts];
if UseSystemCertStore then
begin
Flags := CERT_STORE_OPEN_EXISTING_FLAG or CERT_STORE_READONLY_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE or CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG;
HTTPRStore := HTTPReqResp as IClientCertInfo;
try
hStore := CertOpenStore(CERT_STORE_PROV_SYSTEM,
0,
0,
Flags,
'Root');
HTTPRStore.SetCertStore(hStore);
finally
HTTPRStore := nil;
end;
end;
end;
Этот код необходимо добавить в обработчик событий OnBeforePost вашего компонента THttpRio, чтобы он начал использовать сертификаты из ROOT хранилища системы, где, предположительно, находится необходимый сертификат.
Альтернативный ответ
Также стоит отметить, что для некоторых веб-сервисов, включая упомянутый, сертификат может не требоваться, так как сервис настроен на работу и без него. Однако, если используется компонент THttpRio в Delphi XE7 с WinInet, он может некорректно обрабатывать такие случаи, в отличие от Indy или SOAPUI, которые могут обходить эту проблему.
Для доступа к веб-сервисам, требующим сертификат, но при этом не требующим его для локальных настроек сервиса (например, при обратном приеме сертификата), важно правильно настроить THttpRio с учетом системных хранилищ сертификатов.
Приведенные выше шаги должны помочь в решении проблемы аутентификации клиента при обращении к веб-сервисам в Delphi XE7 на Windows 8.1.
в одном предложении: При работе с веб-сервисом через Delphi XE7 на Windows 8.1 возникает проблема аутентификации клиента, связанная с необходимостью использовать сертификат из системного хранилища ROOT, что требует дополнительной настр
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS