после добавления компонентов IdSSLIOHandlerSocketOpenSSL1
и IdServerIOHandlerSSLOpenSSL1
и назначения их клиент-серверным компонентам TCP (свойство IOHandler) появляется сообщение об ошибке «Не удалось загрузить библиотеку SSL».
Убедитесь, что у вас есть актуальные библиотеки OpenSSL 1.0.2 (Indy еще не поддерживает OpenSSL 1.1.x) в папке вашего приложения или в папке, которую вы указываете с помощью функции IdOpenSSLSetLibPath()
в IdSSLOpenSSLHeaders.hpp
в программепри запуске.
Если у вас по-прежнему возникает ошибка, вы можете использовать функцию Indy WhichFailedToLoad()
в IdSSLOpenSSLHeaders.hpp
, чтобы выяснить, почему библиотеки DLL не загружаются - либо потому, что сами библиотеки DLL не могут быть найдены или загружены в памятьили из-за отсутствия необходимых экспортируемых функций, которые использует Indy.
В этом случае я использовал двоичные файлы OpenSSL 1.0.2 (ssleay32.dll и libeay32.dll) из https://indy.fulgan.com/SSL/.
Известно, что эти DLL прекрасно работают с Indy.
тогда я получаю следующую ошибку:
Ошибка подключения по SSL.Обнаружено, что EOF нарушает протокол.
Эта ошибка означает, что сервер закрыл соединение TCP на своем конце, пока клиент все еще выполнял рукопожатие SSL / TLS.Это может произойти, например, если возникнет исключение на стороне сервера.По умолчанию TIdTCPServer
обрабатывает необработанное исключение, закрывая сокет.
Распространенной ошибкой не является установка для свойства TIdSSLIOHandlerSocketOpenSSL::PassThrough
значения false
на стороне сервера.Его необходимо установить вручную, поскольку TIdTCPServer
не устанавливает его автоматически, чтобы позволить пользователям решать, какой порт (ы) должен использовать SSL / TLS.PassThrough
необходимо установить на true
на обоих концах соединения.
На стороне клиента вы можете установить PassThrough
перед вызовом Connect()
(т. Е. Для неявного SSL) или после (т.е. для STARTTLS-подобных команд).
На стороне сервера вы можете установить PassThrough
в событии OnConnect
(т. е. для неявного SSL) или в событии OnExecute
(т. е. дляSTARTTLS-подобные команды).
В вашем примере попробуйте это:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdSSLIOHandlerSocketOpenSSL1->PassThrough = false;
C1->Connect();
C1->Socket->Write(4);
int res = C1->Socket->ReadInt32();
C1->Disconnect();
ShowMessage(res);
}
void __fastcall TForm1::S1Connect(TIdContext *AContext)
{
static_cast<TIdSSLIOHandlerSocketOpenSSL*>(AContext->Connection->Socket)->PassThrough = false;
}
void __fastcall TForm1::S1Execute(TIdContext *AContext)
{
int x = AContext->Connection->Socket->ReadInt32();
AContext->Connection->Socket->Write(x * x);
AContext->Connection->Disconnect();
}
И, разумеется, убедитесь, что IOHandlers с обеих сторон настроены одинаково для использования совместимых SSL / TLSверсии протокола, сертификаты и т. д.