Есть у меня маленькая написанная на 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;
Костыль?

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