Tomcat与APR的双向SSL在几次请求后丢失了客户端证书

我发现,当访问使用客户端证书身份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案例是:

  • 下载并解压apache-tomcat-8.0.24-windows-x64.zip
  • webapps文件夹中创build一个名为cert的文件夹,在那里创build一个名为ccertA.jsp的文件,其中包含上面的代码片段
  • 在server.xml中添加一行:

    <连接器端口=“8443”protocol =“org.apache.coyote.http11.Http11AprProtocol”secure =“true”scheme =“https”maxThreads =“150”URIEncoding =“UTF-8”SSLV​​erifyClient =“可选”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

  • 打开https:// localhost:8443 / cert / ccertA.jsp页面并每隔几秒钟刷新一次

(请参阅以下链接以获取包含所有必需文件(包括证书文件)的完整testing用例的错误)

如果我不使用APR(通过删除tcnative-1.dll文件并修改JSSE的连接器语法),问题不会发生。

试过的版本,都有问题:

  • apache-tomcat-8.0.24-windows-x64(也是32位版本)
  • Apache的Tomcat的6.0.44-Windows的64位
  • Java 1.6.0更新12和45
  • Java 1.8更新51
  • Windows 7专业版SP1 64位
  • Windows 7专业版SP1 32位
  • Windows 8.1 Pro 64位
  • Windows 10 Home 64位
  • Firefox版本39.0 39.0.3和44
  • Chrome v44
  • Ubuntu 14.04 LTS 64位/ tomcat 7.0.52-1ubuntu0.3 / libapr1:amd64 1.5.0-1 / libtcnative-1:amd64 1.1.29-1

在2010年的tomcat-users邮件列表上讨论了类似的问题: 1分钟超时(SSL,APR)后客户端证书没有了,但是没有解决scheme。 我最近在那里发布了自己的post( 火狐SSL与APR – 失去的客户端证书有更多的细节),但它基本上只是我的独白。

编辑:证书信息

最初我使用由我的私人testingCA颁发的服务器证书进行testing。 现在我也尝试了由可信CA颁发的“真实”证书。 (我用我的个人证书,浏览器抱怨我点击了主机名匹配)。

编辑:错误报告

报告为Bug 58244 – 两次SSL在几次请求后丢失客户端证书

欢迎提出如何debugging问题的build议。

我使用java应用程序(在客户端和服务器上)使用客户端证书的问题太多了。 APR帮助,但它有它自己的问题。 最终,我决定停止尝试,现在我卸载SSL处理到应用程序前面的代理。 Apache和Nginx都能很好地扮演这个angular色。