web-dev-qa-db-ja.com

10.4 Sydneyへの移行後のDelphi Indy SSLエラー

Delphi 10.4でwi​​n32クライアント/サーバーアプリケーションを(INDYおよびTMS Sparkleを使用して)コンパイルすると、sslエラーが発生します。サーバー側ではIndy withと自己署名証明書を、クライアント側では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;

Embaは10.3でなんとかIndyを壊しました、おそらくこれはこのような他のケースですか?

1
MichaSchumann

クレジットは私を正しい方向に向けたレミー・レバウに帰属します。しかし、私はそれをDelphi 10.4で再び機能させるコードを提供することによって私の質問に答えたいと思います。インディの変更が2018(!)に行われたため、10.3で10.4にアップグレードするまで、なぜそれが完全に機能するのかまだわかりません。

TMS Sparke Server for 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;
...

今では以前と同じように動作します。

0
MichaSchumann