Java NIO および SSL ライブラリを使用して記述された、HTTP および HTTPS で実行される HTTP サーバーがあります。HTTPS モードでは、クライアント証明書の有無にかかわらず通信できます。しかし、再交渉をしたいです。ここで、クライアントは HTTPS で接続し、リソースを参照し、非常に安全なリソースに到達すると、サーバーはクライアントに証明書を要求します。これにはいくつかの問題があり、ワークフローがどうあるべきかを知る必要があります。これは、IE 9 と Chrome の両方で観察したことです。
1) クライアントがセキュアなリソースを要求すると、HTTP 要求に完全に応答します。次に、完了時にクライアントに証明書を要求します
engine.setNeedClientAuth(true);
engine.beginHandshake();
その結果、クライアントからの TCP FIN が返され (クライアント側の接続が閉じられます)、再ネゴシエーションは失敗します。
2) クライアントが安全なリソースを要求すると、応答する前に証明書を要求します。このシナリオでは、交換が発生し、両方のブラウザーが証明書の要求をポップアップ表示しますが、プロンプトが表示されるとすぐにクライアントから TCP FIN が送信され、再ネゴシエーションが終了します。クライアントは、最終的に証明書を持つ別の要求を送信します。
ここでの私の質問は、何が起こるはずですか? 最初のブラウザ接続は開いたままであるはずですか、それともこのような終了は正常ですか?
注:ここでのもう 1 つの非常に興味深い観察は、シナリオ 2 で、ブラウザが TCP 接続を閉じると、証明書を選択した後に再接続することです。ただし、リクエストを再送信しません。ただそこに座って、サーバーが応答することを期待していますか? NIO の用語では、OP_READ を待機しています。これは、ソケットの入力バッファーにデータがないことを意味します。ブラウザは、接続を終了した元のメッセージへの応答を期待していますか??
このワークフローに関するドキュメントや仕様がまったくないのは奇妙なことですが、私がテストしたすべてのブラウザーで、このワークフローに従っているようです。