我有一个配置为请求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,我想知道我在这里做错了什么。
sslSessionMgr
null
当然,在客户端上没有通用的解决方案,但幸运的window.crypto.logout()是,FireFox可以解决问题。我在某处读到了相当于IE的document.execCommand("ClearAuthenticationCache")ActiveX控件?无论如何,我似乎都无法为IE或Chrome做到这一点。
window.crypto.logout()
document.execCommand("ClearAuthenticationCache")
那我该怎么办?我可以修复其中任何一种解决方案,还是有其他解决方案?
不幸的是,如本期中所述,Chrome尚不支持此功能。
据我所知,该javax.servlet.request.ssl_session_mgr技巧仅可用于Apache Tomcat 7。
javax.servlet.request.ssl_session_mgr