При работе с базами данных в Delphi через MyDAC (My Data Access Components) разработчики часто сталкиваются с необходимостью установки безопасного соединения с сервером MariaDB через SSL. В данной статье мы рассмотрим распространенную ошибку SSL_do_handshake и предоставим пошаговое решение этой проблемы.
Описание проблемы
Ошибка SSL_do_handshake с кодом -1 и дополнительной информацией SSL_get_error(..., r2) = 1 обычно возникает при попытке установить SSL-соединение между клиентским приложением на Delphi и сервером MariaDB. В представленном коде проблема проявляется, несмотря на корректную настройку параметров SSL.
Анализ кода
Рассмотрим предоставленный код подключения:
procedure TSQLHelper.Connect(const Host, Database, User, Password: string; const SSLConnect: Boolean);
begin
FHost := Host;
FDatabase := Database;
FUsername := User;
FPassword := Password;
FSSLConnect := SSLConnect;
try
if SSLConnect then
begin
FConnection.Options.Protocol := TMyProtocol.mpSSL;
FConnection.SSLOptions.CipherList := 'All';
end;
FConnection.Server := FHost;
FConnection.Database := FDatabase;
FConnection.Username := FUsername;
FConnection.Password := FPassword;
FConnection.Options.UseUnicode := True;
FConnection.Connected := True;
except
on E: Exception do
begin
FLastErrNo := 1001;
FLastError := 'Error connecting to Server ' + FHost + ' with User ' + FUsername + ': ' + E.Message;
end;
end;
end;
Возможные причины ошибки
Несовместимость версий OpenSSL - клиент и сервер используют разные версии библиотек OpenSSL
Неправильный путь к SSL-библиотекам - приложение не может найти или загрузить необходимые DLL
Несоответствие шифров - клиент и сервер не могут договориться о поддерживаемых алгоритмах шифрования
Проблемы с сертификатами - отсутствие или недоверие к корневому сертификату
Пошаговое решение
1. Проверка версий OpenSSL
Убедитесь, что версии OpenSSL на клиенте и сервере совместимы. Для этого можно использовать команду на сервере:
openssl version
И проверить версию клиентских библиотек в вашем приложении.
2. Указание явного пути к SSL-библиотекам
Добавьте в код явное указание пути к библиотекам OpenSSL:
if SSLConnect then
begin
FConnection.Options.Protocol := TMyProtocol.mpSSL;
FConnection.SSLOptions.CipherList := 'All';
FConnection.SSLOptions.SSLLibPath := 'C:\path\to\your\ssl\libs\';
end;
3. Настройка списка шифров
Попробуйте использовать конкретные шифры, которые поддерживаются сервером:
Для диагностики временно отключите SSL и проверьте базовое соединение:
procedure TSQLHelper.TestConnectionWithoutSSL;
begin
try
FConnection.Options.Protocol := TMyProtocol.mpTCP;
FConnection.Server := FHost;
FConnection.Database := FDatabase;
FConnection.Username := FUsername;
FConnection.Password := FPassword;
FConnection.Connected := True;
ShowMessage('Connection successful without SSL');
FConnection.Connected := False;
except
on E: Exception do
ShowMessage('Error without SSL: ' + E.Message);
end;
end;
Заключение
Ошибка SSL_do_handshake при подключении к MariaDB через MyDAC в Delphi обычно связана с несовместимостью SSL-параметров между клиентом и сервером. Представленные в статье решения помогут вам диагностировать и устранить эту проблему. Наиболее эффективными мерами являются:
Проверка совместимости версий OpenSSL
Явное указание путей к SSL-библиотекам
Настройка списка поддерживаемых шифров
Указание корневого сертификата
Если проблема сохраняется, рассмотрите возможность использования альтернативных компонентов для подключения к MariaDB или обратитесь к документации MyDAC для получения дополнительной информации о настройке SSL-соединений.
Описание решения ошибки SSL_do_handshake при SSL-подключении в Delphi к MariaDB через MyDAC
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.