SSLのクライアント証明書を要求するように構成されたWebサーバーがあります。クライアントが受け入れ可能な証明書を持っている場合、実際のコンテンツが表示されますが、そうでない場合は、クライアント認証なしでSSLにフォールバックし、セキュリティトークンを接続して再試行するように通知するエラーページを表示します。
問題は、トークンを接続しても、ブラウザは現在のセッションが正常であると見なすため、新しいSSLセッションを再ネゴシエートしないことです。したがって、現在のSSLセッションを無効にする方法が必要です。
Tomcat6であるサーバーでそれを実行しようとしました。
response.setHeader("Connection", "close"); // open new socket next time
response.flushBuffer();
Object sslSessionMgr = request.getAttribute("javax.servlet.request.ssl_session_mgr");
if (sslSessionMgr != null) {
try {
Method invalidateSession =
Class.forName("org.apache.tomcat.util.net.SSLSessionManager").getMethod("invalidateSession");
invalidateSession.setAccessible(true);
invalidateSession.invoke(sslSessionMgr);
} catch (Exception e) {/*ignore*/}
}
しかし、それsslSessionMgr
は常にそうnull
であり、私はここで何が間違っているのだろうかと思います。
もちろん、クライアントには普遍的な解決策はありませんが、幸いなことwindow.crypto.logout()
にFireFoxのトリックを実行します。document.execCommand("ClearAuthenticationCache")
IEに相当するものは、ActiveXコントロールである、または多分、ActiveXコントロールであるとどこかで読んだことがありますか?いずれにせよ、IEやChromeではできないようです。
だから私はここで何ができますか?これらの解決策のいずれかを修正できますか、または他の解決策はありますか?