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

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

我发现,当使用 Firefox 或 Chrome 访问在 Tomcat/APR(在 Windows 上)上运行的客户端证书身份验证的 Web 应用程序时,客户端证书会在短时间内“丢失”。对于应用程序来说,客户端证书似乎未发送。

示例代码(JSP片段):

User client cert data:
<%= ((java.security.cert.X509Certificate[])
request.getAttribute("javax.servlet.request.X509Certificate"))[0].
getSubjectX500Principal().toString()%>

刷新几次页面后(页面将显示客户端证书 DN),页面将失败并出现 NullPointerException,如下所示请求.getAttribute将返回无效的。它通常发生在不到一分钟的时间内。更准确地说:当每秒重新加载一次时,问题几乎每次都会在 30 秒后出现。此后,每个请求都会以相同的方式失败,直到我重新启动 tomcat(或重新启动 Firefox,或者只是清除 Firefox 中的“活动登录”并在新连接上重新选择证书)。重新启动后,问题总是会再次出现(如果我再次重新启动,问题会在 30 秒内消失)。

这种情况发生在 Firefox(v39 和 v40)和 Chrome(v44)上,但不发生在 IE v11 上。

它也出现在不同版本的 tomcat 和 Java(和操作系统位数)中。

使用最新版本的测试用例是:

  • 下载并解压 apache-tomcat-8.0.24-windows-x64.zip
  • 在里面网络应用程序文件夹创建名为证书,创建一个名为证书A.jsp包含上述代码片段
  • 在server.xml中添加一行:

    <连接器端口="8443" 协议="org.apache.coyote.http11.Http11AprProtocol" 安全="true" 方案="https" 最大线程数="150" URIEncoding="UTF-8" SSLVerifyClient="可选" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" SSLPassword="测试" SSLEnabled="true" SSLCertificateKeyFile="C:/your_server_key_private.pem" SSLCertificateFile="C:/ your_server_key _public.pem" SSLCACertificateFile="C:/supported_client_CAs.pem" />

  • 通过执行启动 tomcat启动脚本

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

(请参阅下面链接的错误,获取包含所有需要的文件(包括证书文件)的完整测试用例)

如果我不使用 APR(通过删除tcnative-1.dll文件并调整连接器语法以适应 JSSE),此问题不会发生。

尝试过各个版本,均存在问题:

  • apache-tomcat-8.0.24-windows-x64(也是 32 位版本)
  • Apache-tomcat-6.0.44-windows-x64
  • Java 1.6.0 更新 12 和 45
  • Java 1.8 更新 51
  • Windows 7 专业版 SP1 64 位
  • Windows 7 专业版 SP1 32 位
  • Windows 8.1 专业版 64 位
  • Windows 10 家庭版 64 位
  • Firefox 版本 39.0 39.0.3 和 44
  • Chrome 版本 44
  • 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)但没有解决方案。我最近自己在那里发帖(带有 APR 的 Firefox SSL - 丢失客户端证书有更多细节),但基本上只是我的独白。

编辑:证书信息

最初,我使用由我的私人测试 CA 颁发的服务器证书进行测试。现在,我还尝试使用由受信任的 CA 颁发的“真实”证书。(我使用了我的个人证书。浏览器抱怨主机名 mitmatch,因此我点击了它)。

编辑:错误报告

报告为Bug 58244 - 双向 SSL 在几次请求后丢失客户端证书

欢迎就如何调试该问题提出建议。

答案1

我在将客户端证书用于 Java 应用程序(在客户端和服务器上)时遇到了太多问题。APR 有所帮助,但它也有自己的问题。最终,我决定停止尝试,现在我将 SSL 处理转移到应用程序前面的代理。Apache 和 Nginx 都非常适合这个角色。

相关内容