Как решить проблему запуска IdTCPServer с IdServerIOHandlerSSLOpenSSL в Linux на Delphi 10.4
При работе с компонентами Indy в Delphi 10.4 под Linux может возникнуть проблема с запуском IdTCPServer с использованием IdServerIOHandlerSSLOpenSSL, связанная с некорректной загрузкой библиотеки SSL. В данной статье рассмотрим, как можно решить эту проблему.
Описание проблемы
Разработчики, использующие Delphi 10.4 для запуска IdTCPServer с IdServerIOHandlerSSLOpenSSL под Linux, могут столкнуться с ошибкой EIdOSSLCouldNotLoadSSLLibrary, указывающей на невозможность загрузки библиотеки SSL. В то же время, под Windows все работает корректно. В директории SSL уже присутствуют файлы для обеих платформ: DLL для Windows и .so файлы, скомпилированные из "openssl-1.1.1j". Директория содержит файлы libeay32.dll, ssleay32.dll, libcrypto.so, libssl.so.
Анализ проблемы
Прежде всего, важно понимать, что под Linux невозможно использовать библиотеки DLL, предназначенные для Windows. Вместо этого, TIdSSLIOHandlerSocketOpenSSL будет искать библиотеки libssl.so.x.x.x[l] и libcrypto.so.x.x.x[l], где x.x.x - это версия 1.0.2 или ниже, и [l] - это необязательный символ a..z, или симлинки libssl.so/libcrypto.so, которые указывают на версии этих библиотек.
Кроме того, TIdSSLIOHandlerSocketOpenSSL (и, соответственно, TIdServerIOHandlerSSLOpenSSL) не поддерживает версии OpenSSL 1.1.x, а работает только с OpenSSL 1.0.2 и более ранними версиями.
Решение проблемы
Для использования OpenSSL 1.1.x необходимо применять другой обработчик ввода-вывода. Один из таких обработчиков находится в статусе pull request на ожидании ревью и пока не был включен в основной код Indy, но его можно попробовать в действии. Ссылка на pull request:
Однако, если вы не хотите экспериментировать с новой версией OpenSSL, рекомендуется установить версию 1.0.2, которая уже проверена и хорошо себя зарекомендовала. Это позволит избежать дополнительных проблем, связанных с интеграцией новой системы.
Пример кода
program ServerSSL;
{$APPTYPE CONSOLE}
uses
IdGlobal,
IdTCPServer,
IdSSLOpenSSL;
var
Server: TIdTCPServer;
begin
Server := TIdTCPServer.Create(nil);
Server.OnExecute := ServerExecute;
Server.IOHandler := TIdServerIOHandlerSSLOpenSSL.Create(nil);
Server.DefaultPort := 12345;
Server.BindToIP := '127.0.0.1';
Server.Active := True;
// Ожидание нажатия клавиши для выхода
Readln;
Server.Active := False;
Server.Free;
TIdSSLIOHandlerSocketOpenSSL.UnLoadSSLLib();
end;
procedure ServerExecute(AContext: TIdContext);
begin
// Ваш код обработки запроса
end;
Заключение
При работе с IdTCPServer и IdServerIOHandlerSSLOpenSSL в Linux на Delphi 10.4 важно убедиться, что используются корректные библиотеки OpenSSL, соответствующие требованиям компонентов Indy. Установка версии OpenSSL 1.0.2 является проверенным решением для устранения возникшей проблемы.
Следуя этим рекомендациям, вы сможете успешно запустить IdTCPServer с IdServerIOHandlerSSLOpenSSL в среде Linux на Delphi 10.4.
Разработчики столкнулись с проблемой запуска `IdTCPServer` с `IdServerIOHandlerSSLOpenSSL` в Linux на Delphi 10.4, связанной с некорректной загрузкой библиотеки SSL, и рассматривают способы её решения, включая использование альтернати
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS