Delphi Ошибка Indy SSL после перехода на 10.4 Sydney - PullRequest
1 голос
/ 28 мая 2020

После компиляции моего клиент-серверного приложения win32 (с использованием INDY и TMS Sparkle) с Delphi 10.4 я получаю ошибку ssl. Я использую Indy с самоподписанным сертификатом на стороне сервера и indy на стороне клиента. Сообщение об ошибке (переведено с немецкого):

Ошибка соединения с SSL. EOF обнаружил нарушение протокола.

Я не менял код или среду с версии 10.3, где она работала отлично. Я могу разбить его на серверную часть, поскольку старый сервер (скомпилированный в 10.3) работает с новым клиентом (скомпилирован с 10.4), но старый клиент также ломается при попытке подключиться к новому серверу.

Это вот как я инициализирую SSL:

    SecureServer := TIndySparkleHTTPServer.create(nil);
    SecureServer.DefaultPort := SecurePort;
    // Initialize SSL with self signed certificate
    SSLHandler := TIdServerIOHandlerSSLOpenSSL.create(SecureServer);
    SSLHandler.SSLOptions.CertFile := SharedVals.ServerPath + 'appcert.pem';
    SSLHandler.SSLOptions.RootCertFile := SharedVals.ServerPath + 'approot.pem';
    SSLHandler.SSLOptions.KeyFile := SharedVals.ServerPath + 'appkey.pem';
    SSLHandler.SSLOptions.Method := sslvSSLv23;
    SecureServer.IOHandler := SSLHandler;

Эмба сумела сломать Indy в 10.3, возможно, это другой такой случай?

1 Ответ

0 голосов
/ 06 июня 2020

Кредит принадлежит Реми Лебау, который указал мне правильное направление. Но я хочу ответить на свой вопрос, предоставив код, который заставил его снова работать в Delphi 10.4. Поскольку изменение в Indy было сделано в 2018 году (!), Я до сих пор не понимаю, почему он отлично работал в 10.3 до обновления до 10.4.

Поскольку я использую TMS Sparke Server для Indy непосредственно в проекте службы / демона Я поставляю небольшой класс для подключения метода OnQuerySSLPort, который ожидает объектный метод.

type
  TSSLHelper = class
  // This helper class is neccessary to set ssl true
  // as it defaults to false on non standard ssl ports
    procedure QuerySSLPort(APort: Word; var VUseSSL: boolean);
  end;

...

procedure TSSLHelper.QuerySSLPort(APort: Word; var VUseSSL: boolean);
begin
  VUseSSL := true;
end;

...

SecureServer := TIndySparkleHTTPServer.create(nil);
SecureServer.DefaultPort := SecurePort;
// Initialize SSL with self signed certificate
SSLHandler := TIdServerIOHandlerSSLOpenSSL.create(SecureServer);
SSLHandler.SSLOptions.CertFile := SharedVals.ServerPath + 'appcert.pem';
SSLHandler.SSLOptions.RootCertFile := SharedVals.ServerPath + 'approot.pem';
SSLHandler.SSLOptions.KeyFile := SharedVals.ServerPath + 'appkey.pem';
SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
SecureServer.IOHandler := SSLHandler;
SSLHelper := TSSLHelper.Create;
SecureServer.OnQuerySSLPort := SSLHelper.QuerySSLPort;
...

Теперь он работает как раньше.

...