一尘不染

如何在网络浏览器上触发SSL重新握手?

tomcat

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

那我该怎么办?我可以修复其中任何一种解决方案,还是有其他解决方案?


阅读 308

收藏
2020-06-16

共1个答案

一尘不染

不幸的是,如本期中所述,Chrome尚不支持此功能

据我所知,该javax.servlet.request.ssl_session_mgr技巧仅可用于Apache Tomcat 7。

2020-06-16