5

Java ベースの Usenet クライアントで Netty をバックエンドとして使用しています。ライブラリは正常に動作していますが、状況によっては、まさに次のエラーが原因で、SSL 経由でリモート サーバーに接続できません。

Java: SSL ハンドシェイクで「DH キーペアを生成できませんでした」という例外が発生するのはなぜですか?

残念ながら、何らかの理由でこの Java エラーはまだ修正されていないようです。また、リモート サーバーは私の管理下にないため、ここで回避策が必要です。上記のリンクによると、そのような「解決策」の 1 つは、SSL ハンドシェイク中に DH をまったく回避することです (あまりきれいではありませんが、何もしないよりはましかもしれません)。

ただし、私は SSL の専門家ではないため、Netty 内でそれを実装する方法がよくわかりません。またはそれ以上:Nettyに基づく私のソリューション内。今では、次のように接続を作成しています。

// configure the Netty client
ClientBootstrap bootstrap = new ClientBootstrap(clSockChannelFactory);

// configure the pipeline factory
bootstrap.setPipelineFactory(channelPipelineFactory);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
bootstrap.setOption("child.receiveBufferSizePredictorFactory", 
          new AdaptiveReceiveBufferSizePredictorFactory());

// start the connection attempt
InetSocketAddress isa = new InetSocketAddress(serverAddress, port);
ChannelFuture future = bootstrap.connect(isa);
...
channel = future.getChannel();
...

それは問題ありませんが、上記のスレッドで説明されているように、SSL ソケットに接続する前にどこで暗号スイートを無効にできますか?

ご協力いただきありがとうございます。

よろしく、 マティアス

PS: ところで、この問題が Java でまだ解決されていない理由を教えてください。

4

1 に答える 1

2

私は Netty には詳しくありませんが、セキュア チャットの例のアプローチに従うことをお勧めします。

デフォルトの SSL/TLS キー/信頼設定がどのようなものかはわかりませんが、カスタム がない場合は をSSLContext試してくださいSSLContext.getDefault()

次に、SSLEngineusing を作成しSSLContext.createSSLEngine()ます。これで、必要な暗号スイートSSLEngineを有効にできるはずです。Oracle JRE (または OpenJDK) を使用していると仮定すると、暗号スイートのリストは Sun Provider documentation にあります

この後 (これは Netty 固有の部分です)、次のSslHandlerようなものを使用して設定します (Netty の例を参照)。

pipeline.addLast("ssl", new SslHandler(engine));
于 2012-04-05T21:48:49.187 に答える