2016-09-01 15 views
1

TransportListener(基本的にHTTPS接続用に特定のポートをリスンするリスナー)が起動するときに、SSLContextをロードするリアクタパターンの実装があります。 。私は信頼ストアから/に証明書を追加または削除したら共有SSLContextオブジェクトのinit()を再度呼び出すときのSSLEngineへの影響

は、その後、私は(リスナーのメソッドにJMXコールを介して)

sslContext.init(keyManagers, trustManagers, null); 

再び同じinit()メソッドを呼び出します。リスナーのダウンタイムを避けるために、SSLContextをリロードする必要があります。

これは私が現在直面している問題です。

リスナーに要求があり、接続が確立されたとします。応答がクライアントに返される前にSSLContextオブジェクトをリロードすると、接続のSSLEngineオブジェクトのwrapプロセスが送信前にペイロードを暗号化しますか?

:リスナーが起動されたとき、私は同じSSLContextオブジェクトはすべてSSLEngines.The SSLContextオブジェクトに渡されていることを検証していますが、いくつかの他のオブジェクトに渡されます。たとえば、このSSLContextオブジェクトを渡す必要がある接続プールがあります。したがって、新しいSSLContextオブジェクトを作成すると、接続プールが完全に破棄されます。そのため、私は同じSSLContextオブジェクトを使用しようとしています。

+1

あなたが自分でしなければならないことを決める前に、あなた自身でこれをテストすることを妨げるものは何もありませんでした。新しい証明書をロードするたびに*新しい* SSLContextを使用することを止められることはありません。これによってリスナーのダウンタイムも回避されます。同じSSLSessionを複数のSSLEnginesに渡すことはできません。あなたは 'SSLContext'を意味しますか? – EJP

+0

...新しいコンテキストを設定せずにトラストストアを変更することができます。 – eckes

+0

これを他のすべてのユースケースでテストしました。しかし、私は上記のようなシナリオを再現することはできません(応答を送信する前にsslcontextを変更しますが、要求を受け取った後に変更します)。 @eckes私はトラストストアを変更することに問題はありません。私が必要とするのは、 'Listener'を再起動せずに、実行時にトラストストアをリロードすることです。 –

答えて

0

あなたはこれを考える必要があります。接続が確立されている場合は、既に証明書交換が行われているため、新しい証明書は必要ありません。したがって、部分ハンドシェイクまでの新規または再初期化の必要はありません。現在のセッションのキーを再入力するか、クライアント証明書を要求します。 SSLContextは完全なハンドシェイクが不足している場合には使用しないでください。あなたがする必要がどのような

は、新しい証明書を必要としているすべての新しい接続用の新しいSSLContextを使用し始めています。既存の接続には定義上何もする必要はありません。

+0

混乱して申し訳ありません。私はそれを更新しました。私は 'SSLContext'オブジェクトを渡しています。私が知りたいのは、 'SSLEngine'オブジェクトを使ってラップアンドラップする既存のソケット接続が' SSLContext'オブジェクトのトラストマネージャを変更することによって影響を受けるかどうかです。これは、要求が受信されたが応答がまだ送信されていないシナリオでのみ問題になります。受信した接続がキーのセットを使用してアンラップされる可能性はありますか?そして、通信を中断するキーの別のセットを使用して応答がラップされているのですか? –

+0

セッションキーは 'SSLContext'ではなく' SSLSession'にありますが、なぜあなたは既存の接続の 'SSLContext 'を再初期化する必要があると思いますか? – EJP

+0

つまり、 'SSLEngine'は手ぶれに' SSLContext'しか使用しません。したがって、その後、SSLContextの変更は、ハンドシェイクでない場合には、既存のSSLSessionまたは接続/ソケットのSSLEngineに影響しません。私は正しいですか? –

関連する問題