Tomcat / JBoss删除SSL并强制新握手

时间:2011-07-13 18:06:30

标签: java tomcat ssl jboss

有谁知道如何从用户会话中删除SSL证书并强制再次完成SSL握手?

我尝试通过调用

删除证书
request.removeAttribute("javax.servlet.request.X509Certificate");

但这似乎没有成功。事实上,代码似乎忽略了该属性。

2 个答案:

答案 0 :(得分:1)

获取证书的代码最终会调用org.apache.tomcat.util.net.jsse.JSSESupport.getPeerCertificateChain(...)。但是,只有在证书尚未与会话关联时才会触发重新协商:

if(jsseCerts.length <= 0 && force) {
    session.invalidate();
    handShake();
    session = ssl.getSession();
}

因此,由于您已经拥有SSLSession的证书(并且因为从请求中删除属性对此没有影响),您将无法触发将要进行的重新协商你忘记了证书。

您可能会发现需要在Tomcat(调用getPeerCertificateChain)中修补各种类的实现来实现此目的。如果要执行“SSL注销”(类似),则需要执行此操作。 您可以通过使用Connection: close HTTP标头请求客户端关闭连接(从而创建一个它将在没有客户端证书的情况下协商的新连接)。但是,由于通常由关闭方发送它,因此无法保证收件人(客户端)将关闭它(并且据我所知,在Servlet规范中没有任何内容,在Tomcat实现中也没有,允许用来强制关闭连接。)

答案 1 :(得分:1)

这是两个不同的问题。

  1. 该属性仅适用于要使用的Servlet和过滤器。 Tomcat不使用它,事实上,一旦存在SSL会话并且身份验证成功,它就不会真正关心证书。您可以删除该属性,但实际上只是在欺骗自己,

  2. 如果您既可以使SSL会话无效并请求新的握手,那么无论如何都会传递新证书,可能是相同的证书,除非在此期间浏览器证书发生了什么。这将覆盖请求属性,因此您不需要首先清除它。但是我不知道你有什么方法可以使Tomcat中的SSL会话或重新抖动无效,除了提供你自己的SSL连接器以及可以通过Servlet或过滤器访问的API,我不知道如何做到这一点任

  3. 您可以随时告诉我们您的要求。