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

Решение проблемы соединения с SSL через CDN: как настроить TIdSSLIOHandlerSocketOpenSSL для работы с Cloudflare в Delphi 11.3

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

 

Введение

Проблемы с SSL-соединением при использовании CDN (Content Delivery Network), таких как Cloudflare, являются распространённой проблемой среди разработчиков, использующих Indy в Delphi. В данной статье мы разберём конкретную проблему, с которой столкнулся пользователь GabrielMoraru, и предложим несколько решений для корректной работы SSL-соединения через Cloudflare.

Описание проблемы

Пользователь столкнулся со следующими ошибками при попытке установить SSL-соединение через Cloudflare:

Exception class EIdOSSLUnderlyingCryptoError with message '
Error connecting with SSL. error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error'

При изменении версий SSL на [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2] появляется другая ошибка:

error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error'

Интересно, что без активации CDN соединение работает корректно.

Анализ проблемы

Основные факторы, влияющие на проблему:

  1. Версия OpenSSL: используется openssl-1.0.2u-i386-win32.zip, которая уже устарела
  2. Версия Indy: 10.6.2 (поставляемая с Delphi 11.3)
  3. Настройки SSL: указаны конкретные версии TLS и набор шифров
  4. User-Agent: Cloudflare может блокировать запросы с нестандартными User-Agent

Решения проблемы

1. Обновление OpenSSL

Первым шагом рекомендуется обновить библиотеки OpenSSL до более новых версий (1.1.1 или 3.x). Устаревшие версии могут не поддерживать современные требования безопасности Cloudflare.

// Убедитесь, что используете актуальные DLL-библиотеки
IdOpenSSLSetLibPath(AppData.SysDir);  // путь к libcrypto-1_1.dll и libssl-1_1.dll

2. Настройка TIdSSLIOHandlerSocketOpenSSL

Вот обновлённая конфигурация SSL-обработчика:

SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
  SSLHandler.OnStatusInfo := StatusInfo;
  SSLHandler.SSLOptions.Method := sslvTLSv1_2;
  SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2]; // Используем только TLS 1.2
  SSLHandler.SSLOptions.CipherList := 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:' +
                                     'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:' +
                                     'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:' +
                                     'DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
  SSLHandler.SSLOptions.Mode := sslmClient;
  SSLHandler.SSLOptions.VerifyDepth := 2;
  SSLHandler.SSLOptions.VerifyMode := []; // Временно для тестирования
finally
  // Обработка ошибок
end;

3. Настройка User-Agent

Cloudflare может блокировать запросы с нестандартными User-Agent. Добавьте стандартный User-Agent браузера:

HTTPClient := TIdHTTP.Create(nil);
try
  HTTPClient.IOHandler := SSLHandler;
  HTTPClient.Request.ContentType := 'application/json';
  HTTPClient.Request.Accept := 'application/json';
  HTTPClient.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'+
   ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';
finally
  // Обработка ошибок
end;

4. Альтернативное решение: использование TNetHTTPClient

Если проблемы с Indy сохраняются, можно использовать альтернативный компонент TNetHTTPClient:

var
  HTTPClient: TNetHTTPClient;
  Request: TStream;
  Response: IHTTPResponse;
begin
  HTTPClient := TNetHTTPClient.Create(nil);
  try
    HTTPClient.ContentType := 'application/json';
    HTTPClient.Accept := 'application/json';
    HTTPClient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '+
     'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';

    Request := TStringStream.Create(Format('{"activation_token": "%s", "user_id": "%s"}', 
     [aKey, UserID]), TEncoding.UTF8);
    try
      Response := HTTPClient.Post(URL, Request);
      // Обработка ответа
    finally
      Request.Free;
    end;
  finally
    HTTPClient.Free;
  end;
end;

Дополнительные рекомендации

  1. Проверка сертификатов: в рабочей версии кода не следует отключать проверку сертификатов (VerifyMode := [])

  2. Обновление Indy: рассмотрите возможность обновления Indy до последней версии с GitHub

  3. Анализ трафика: используйте инструменты вроде Wireshark для анализа SSL-рукопожатия

  4. Проверка Cloudflare Settings: убедитесь, что в настройках Cloudflare не включены слишком строгие ограничения

Заключение

Проблемы с SSL-соединением через Cloudflare в Delphi могут быть решены несколькими способами: обновлением OpenSSL, правильной настройкой TIdSSLIOHandlerSocketOpenSSL, установкой корректного User-Agent или переходом на TNetHTTPClient. Каждое решение имеет свои преимущества, и выбор зависит от конкретных требований вашего проекта.

Если проблема сохраняется после применения этих решений, рекомендуется обратиться к документации Cloudflare или на специализированные форумы по Delphi для более детального анализа конкретного случая.

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

В статье рассматриваются проблемы с SSL-соединением через Cloudflare при использовании Indy в Delphi и предлагаются решения, такие как обновление OpenSSL, настройка TIdSSLIOHandlerSocketOpenSSL, изменение User-Agent или переход на TNetHTTPClient.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-04-25 07:45:27/0.0060100555419922/0