有谁知道如何从用户会话中删除SSL证书并强制再次完成SSL握手?
我尝试通过调用
删除证书request.removeAttribute("javax.servlet.request.X509Certificate");
但这似乎没有成功。事实上,代码似乎忽略了该属性。
答案 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)
这是两个不同的问题。
该属性仅适用于要使用的Servlet和过滤器。 Tomcat不使用它,事实上,一旦存在SSL会话并且身份验证成功,它就不会真正关心证书。您可以删除该属性,但实际上只是在欺骗自己,
如果您既可以使SSL会话无效并请求新的握手,那么无论如何都会传递新证书,可能是相同的证书,除非在此期间浏览器证书发生了什么。这将覆盖请求属性,因此您不需要首先清除它。但是我不知道你有什么方法可以使Tomcat中的SSL会话或重新抖动无效,除了提供你自己的SSL连接器以及可以通过Servlet或过滤器访问的API,我不知道如何做到这一点任
您可以随时告诉我们您的要求。