我有一个配置为请求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。

10-05 21:23
查看更多