Есть у меня маленькая написанная на Delphi утилита, которая, используя TNetHTTPClient POST-запросом, забирает с сайта заказчика справочники для тестирования нашей системы. Попытался я скачать новый справочник, а утилита вместо JSON'а с данными выдала мне ошибку "ENetHTTPCertificateException: Server Certificate Invalid or not present":
Я попробовал зайти на страницу сервиса браузером и получил сообщение "Сервер не может подтвердить связь с доменом заказчик.by. Срок действия его сертификата безопасности истек 33 дня назад.". Оказалось, что при его переводе с HTTP на HTTPS, что-то у них пошло не так...
От этой ошибки избавиться очень просто. Объекту TNetHTTPClient необходимо добавить свой обработчик события OnValidateServerCertificate (TValidateCertificateEvent), которое возникает при проверке действительности сертификата сервера. В обработчике достаточно присвоением True параметру Accepted подтвердить, что сертификат действителен:
От этой ошибки избавиться очень просто. Объекту 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;Костыль?
Комментариев нет:
Отправить комментарий