Delphi 10.4でwin32クライアント/サーバーアプリケーションを(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を壊しました、おそらくこれはこのような他のケースですか?
クレジットは私を正しい方向に向けたレミー・レバウに帰属します。しかし、私はそれを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;
...
今では以前と同じように動作します。