我有一个配置为请求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做到这一点。那我该怎么办?我可以修复其中任何一种解决方案,还是有其他解决方案?
最佳答案
遗憾的是,如this issue中所述,Chrome尚不支持此功能。
据我所知,javax.servlet.request.ssl_session_mgr
技巧仅可用于Apache Tomcat 7。