我有一个配置为请求 SSL 客户端证书的 Web 服务器。如果客户端有一个可接受的证书,他们将看到实际内容,但如果没有,我会在没有客户端身份验证的情况下回退到 SSL,并显示一个错误页面,通知他们连接他们的安全 token 并重试。
问题是,即使他们连接了 token ,浏览器也不会重新协商新的 SSL session ,因为它认为当前 session 正常。所以我需要一种方法来使当前的 SSL session 无效。
我尝试在服务器上执行此操作,它是 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 做到这一点。
那我能在这里做什么呢?我可以修复这些解决方案中的任何一个,还是有任何其他解决方案?
最佳答案
不幸的是,正如 this issue 中所讨论的,这在 Chrome 中尚不支持。 .
据我所知,javax.servlet.request.ssl_session_mgr
技巧仅适用于 Apache Tomcat 7。
关于internet-explorer - 如何在网络浏览器上触发 SSL 重新握手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229027/