3

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

那么我可以在这里做什么?我可以修复这些解决方案中的任何一个,还是有其他解决方案?

4

1 回答 1

2

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

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

于 2012-04-19T13:38:11.683 回答