我发现,当访问使用客户端证书身份validation的Web应用程序在Firefox或Chrome上运行Tomcat / APR(在Windows上)时,客户端证书在短时间内“丢失”。 对于应用程序,它似乎没有发送客户端证书。
示例代码(JSP片段):
User client cert data: <%= ((java.security.cert.X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"))[0]. getSubjectX500Principal().toString()%>
刷新页面(显示客户端证书的DN)后,页面将失败,并发出NullPointerExceptionexception, request.getAttribute将返回null 。 它通常发生在不到一分钟的时间。 更确切地说,每秒重新加载一次,几乎每次都在30秒后出现。 之后,每个请求将以相同的方式失败,直到我重新启动tomcat(或者重新启动Firefox,或者只是清除Firefox中的“Active Logins”,然后在新的连接上重新select证书)。 重新启动后,问题总是返回(如果我再次重新启动,则会消失30秒)。
Firefox(v39和v40)和Chrome(v44)发生这种情况,IE v11则不会。
它也发生在不同版本的tomcat和Java(以及操作系统位数)上。
使用最新版本的testing案例是:
在server.xml中添加一行:
<连接器端口=“8443”protocol =“org.apache.coyote.http11.Http11AprProtocol”secure =“true”scheme =“https”maxThreads =“150”URIEncoding =“UTF-8”SSLVerifyClient =“可选”SSLProtocol =“ TLSv1 + TLSv1.1 + TLSv1.2“SSLPassword =”testing“SSLEnabled =”true“SSLCertificateKeyFile =”C:/your_server_key_private.pem“SSLCertificateFile =”C:/ your_server_key _public.pem“SSLCACertificateFile =”C:/supported_client_CAs.pem “/>
通过执行startup.bat启动tomcat
(请参阅以下链接以获取包含所有必需文件(包括证书文件)的完整testing用例的错误)
如果我不使用APR(通过删除tcnative-1.dll文件并修改JSSE的连接器语法),问题不会发生。
试过的版本,都有问题:
在2010年的tomcat-users邮件列表上讨论了类似的问题: 1分钟超时(SSL,APR)后客户端证书没有了,但是没有解决scheme。 我最近在那里发布了自己的post( 火狐SSL与APR – 失去的客户端证书有更多的细节),但它基本上只是我的独白。
编辑:证书信息
最初我使用由我的私人testingCA颁发的服务器证书进行testing。 现在我也尝试了由可信CA颁发的“真实”证书。 (我用我的个人证书,浏览器抱怨我点击了主机名匹配)。
编辑:错误报告
报告为Bug 58244 – 两次SSL在几次请求后丢失客户端证书
欢迎提出如何debugging问题的build议。
我使用java应用程序(在客户端和服务器上)使用客户端证书的问题太多了。 APR帮助,但它有它自己的问题。 最终,我决定停止尝试,现在我卸载SSL处理到应用程序前面的代理。 Apache和Nginx都能很好地扮演这个angular色。