В этой статье мы рассмотрим, как получить сертификат X509 при HTTPS-соединении с использованием компонента TSslHttpCli в Delphi. Этот вопрос возник у пользователя на форуме, и мы детально разберём решение, а также предложим альтернативные подходы.
Понимание проблемы
При установке защищённого HTTPS-соединения сервер предоставляет клиенту свой X509-сертификат. В некоторых случаях необходимо получить этот сертификат для дополнительной проверки или анализа. Как правильно это сделать в Delphi с использованием компонента TSslHttpCli?
Основное решение через событие OnSslHandshakeDone
Как указал Angus Robertson в обсуждении, сертификат можно получить в событии OnSslHandshakeDone, где передаётся параметр PeerCert:
procedure TForm1.SslHttpCli1SslHandshakeDone(Sender: TObject;
ErrCode: Word; PeerCert: TX509Base; var Disconnect: Boolean);
var
CertInfo: string;
begin
if ErrCode = 0 then
begin
if Assigned(PeerCert) then
begin
// Получаем информацию о сертификате
CertInfo := 'Сертификат получен:' + sLineBreak +
'Subject: ' + PeerCert.SubjectOneLine + sLineBreak +
'Issuer: ' + PeerCert.IssuerOneLine + sLineBreak +
'Valid From: ' + DateTimeToStr(PeerCert.NotBefore) + sLineBreak +
'Valid Until: ' + DateTimeToStr(PeerCert.NotAfter);
Memo1.Lines.Add(CertInfo);
end
else
Memo1.Lines.Add('Сертификат не получен');
end
else
Memo1.Lines.Add('Ошибка SSL-рукопожатия: ' + IntToStr(ErrCode));
end;
Важные замечания:
SslVerifyPeer должен быть True: Как отметил Angus, PeerCert будет пустым, если не установлено свойство SslVerifyPeer в True в контексте SSL.
SslHttpCli1.SslContext.SslVerifyPeer := True;
Версия ICS: В более новых версиях ICS (начиная с 9.1) корневой пакет сертификатов загружается автоматически. Для версии 8.70 и старше необходимо указать корневой пакет вручную.
Альтернативный способ: получение сертификата после запроса
Если вам нужно получить сертификат после выполнения запроса, можно использовать свойство SslContext компонента TSslHttpCli:
procedure TForm1.Button1Click(Sender: TObject);
var
PeerCert: TX509Base;
CertPem: string;
begin
// Выполняем HTTPS-запрос
SslHttpCli1.Get('https://example.com');
// Получаем сертификат из SSL-контекста
PeerCert := SslHttpCli1.SslContext.PeerCert;
if Assigned(PeerCert) then
begin
// Получаем сертификат в формате PEM (Base64)
CertPem := PeerCert.PemLine;
Memo1.Lines.Add('Сертификат в формате PEM:');
Memo1.Lines.Add(CertPem);
// Альтернативно: можно сохранить сертификат в файл
PeerCert.SaveToPemFile('server_cert.pem');
end
else
Memo1.Lines.Add('Не удалось получить сертификат сервера');
end;
Проверка сертификата с помощью OCSP
Для дополнительной проверки сертификата можно использовать Online Certificate Status Protocol (OCSP). Вот пример кода:
procedure TForm1.CheckCertificateWithOCSP(ACert: TX509Base);
var
Ocsp: TOcsp;
Status: TOcspStatus;
begin
Ocsp := TOcsp.Create(nil);
try
Status := Ocsp.Verify(ACert);
case Status of
ocspGood:
Memo1.Lines.Add('Сертификат действителен по данным OCSP');
ocspRevoked:
Memo1.Lines.Add('Сертификат отозван!');
ocspUnknown:
Memo1.Lines.Add('Статус сертификата неизвестен');
else
Memo1.Lines.Add('Ошибка проверки OCSP');
end;
finally
Ocsp.Free;
end;
end;
Использование TSslHttpRest для автоматической проверки
Как советовал Angus, для более удобной работы с HTTPS и автоматической проверки сертификатов лучше использовать TSslHttpRest:
procedure TForm1.Button2Click(Sender: TObject);
var
HttpRest: TSslHttpRest;
begin
HttpRest := TSslHttpRest.Create(nil);
try
HttpRest.URL := 'https://example.com/api';
HttpRest.RestParams.Add('param1=value1');
if HttpRest.Get then
begin
Memo1.Lines.Add('Запрос выполнен успешно');
Memo1.Lines.Add('Ответ: ' + HttpRest.ResponseStr);
// Сертификат уже автоматически проверен
if Assigned(HttpRest.SslContext.PeerCert) then
Memo1.Lines.Add('Сертификат действителен: ' +
HttpRest.SslContext.PeerCert.SubjectOneLine);
end
else
Memo1.Lines.Add('Ошибка запроса: ' + HttpRest.ResponseError);
finally
HttpRest.Free;
end;
end;
Заключение
Получение и проверка X509-сертификатов в Delphi с использованием компонентов ICS требует внимания к нескольким ключевым моментам:
Убедитесь, что SslVerifyPeer установлен в True
Используйте событие OnSslHandshakeDone или проверяйте PeerCert после запроса
Для автоматической проверки сертификатов используйте TSslHttpRest
Обновите ICS до последней версии для автоматической загрузки корневых сертификатов
Примеры кода в этой статье помогут вам реализовать проверку сертификатов в ваших приложениях на Delphi. Для более сложных сценариев обратитесь к демонстрационным примерам, поставляемым с ICS (таким как OverbyteIcsHttpsTst1.pas и OverbyteIcsHttpRestTst).
Статья описывает методы получения и проверки X509-сертификатов при HTTPS-соединении с использованием компонента TSslHttpCli в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.