我有一个配置为请求 SSL 客户端证书的 Web 服务器。如果客户端有一个可接受的证书,他们将看到实际内容,但如果没有,我会在没有客户端身份验证的情况下回退到 SSL,并显示一个错误页面,通知他们连接他们的安全令牌并重试。
问题是,即使他们连接了他们的令牌,浏览器也不会重新协商新的 SSL 会话,因为它认为当前会话很好。所以我需要一种方法来使当前的 SSL 会话无效。
我尝试在服务器上执行此操作,这是一个 Tomcat 6:
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 解决了问题。我在某处读到 IE 的等价物是document.execCommand("ClearAuthenticationCache")
或者可能是一些 ActiveX 控件?无论如何,我似乎无法为 IE 或 Chrome 做到这一点。
那么我可以在这里做什么?我可以修复这些解决方案中的任何一个,还是有其他解决方案?