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

Как получить сертификат X509 с помощью TSslHttpCli в Delphi

Delphi , Интернет и Сети , Интернет

 

В этой статье мы рассмотрим, как получить сертификат 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;

Важные замечания:

  1. SslVerifyPeer должен быть True: Как отметил Angus, PeerCert будет пустым, если не установлено свойство SslVerifyPeer в True в контексте SSL.
SslHttpCli1.SslContext.SslVerifyPeer := True;
  1. Версия 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 требует внимания к нескольким ключевым моментам:

  1. Убедитесь, что SslVerifyPeer установлен в True
  2. Используйте событие OnSslHandshakeDone или проверяйте PeerCert после запроса
  3. Для автоматической проверки сертификатов используйте TSslHttpRest
  4. Обновите ICS до последней версии для автоматической загрузки корневых сертификатов

Примеры кода в этой статье помогут вам реализовать проверку сертификатов в ваших приложениях на Delphi. Для более сложных сценариев обратитесь к демонстрационным примерам, поставляемым с ICS (таким как OverbyteIcsHttpsTst1.pas и OverbyteIcsHttpRestTst).

Создано по материалам из источника по ссылке.

Статья описывает методы получения и проверки X509-сертификатов при HTTPS-соединении с использованием компонента TSslHttpCli в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Интернет ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:31:23/0.0077531337738037/1