Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обращение к веб-сервису через Delphi XE7: Проблема аутентификации клиента на Windows 8.1

Delphi , Программа и Интерфейс , Процессы и Сервисы

При работе с веб-сервисами в среде 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:57:18/0.0029840469360352/0