07 мая 2024

Ошибка TNetHTTPClient "ENetHTTPCertificateException: Server Certificate Invalid or not present"

Есть у меня маленькая написанная на Delphi утилита, которая, используя TNetHTTPClient POST-запросом, забирает с сайта заказчика справочники для тестирования нашей системы. Попытался я скачать новый справочник, а утилита вместо JSON'а с данными выдала мне ошибку "ENetHTTPCertificateException: Server Certificate Invalid or not present":
Delphi TNetHTTPClient. Ошибка ENetHTTPCertificateException: Server Certificate Invalid or not present
Я попробовал зайти на страницу сервиса браузером и получил сообщение "Сервер не может подтвердить связь с доменом заказчик.by. Срок действия его сертификата безопасности истек 33 дня назад.". Оказалось, что при его переводе с HTTP на HTTPS, что-то у них пошло не так...
От этой ошибки избавиться очень просто. Объекту TNetHTTPClient необходимо добавить свой обработчик события OnValidateServerCertificate (TValidateCertificateEvent), которое возникает при проверке действительности сертификата сервера. В обработчике достаточно присвоением True параметру Accepted подтвердить, что сертификат действителен:
type
  TDict = class
  private
    FHTTP: TNetHTTPClient;
    ...
    procedure ValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean);
  public
    constructor Create(const AApiURL, AUserName, AUserPassword: String);
    ...
  end;
...  
constructor TDict.Create(const AApiURL, AUserName, AUserPassword: String);
begin
  FHTTP := TNetHTTPClient.Create(nil);
  FHTTP.CredentialsStorage.AddCredential(TCredentialsStorage.TCredential.Create(TAuthTargetType.Server, '', '', AUserName, AUserPassword));
  FHTTP.ContentType := 'application/json';
  FHTTP.OnValidateServerCertificate := ValidateServerCertificate;
  ...
end;

procedure TDict.ValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean);
begin
  Accepted := True;
end;
Костыль?

Комментариев нет:

Отправить комментарий