【问题标题】:Can't get X509 root certificate from client in Tomcat无法从 Tomcat 中的客户端获取 X509 根证书
【发布时间】:2012-04-07 16:11:19
【问题描述】:

我正在尝试为我们的应用程序设置一个测试环境,该环境在 Tomcat 6.0 中通过 HTTPS 使用 X.509 客户端身份验证。 servlet 代码期望使用 servlet 请求的 javax.servlet.request.X509Certificate 将证书链作为 X509Certificate 对象的数组。但是,这个数组只包含一个项目(客户端证书),我希望它有两个(客户端证书和签署它的根 CA 证书)。

这是我到目前为止所做的:

  1. 使用 openssl 生成自签名 CA 证书。
  2. 将 CA 证书作为受信任的根证书导入新创建的 Java 密钥库。
  3. 将 Tomcat HTTPS 连接器配置为要求使用在步骤 2 中创建的密钥库作为信任库进行客户端身份验证:
    • clientAuth="true"
    • truststoreFile="<path_to_truststore>"
  4. 使用 openssl 生成新的客户端证书并使用 CA 证书对其进行签名。
  5. 启动 Tomcat。
  6. 在 Chrome 中安装客户端证书并导航到我的服务器主页。单步调试代码,我可以看到以javax.servlet.request.X509Certificate 属性返回的数组只有客户端证书。

我知道 Tomcat 正在从信任库中获取根 CA 证书,因为当我从信任库中删除它时,我收到 SSL 连接错误。它只是没有像文档所说的那样将其放入 servlet 请求中。我在这里缺少任何其他配置吗?也许 Tomcat(或 Java 或 JSSE)期待一些额外的 X509 V3 扩展或什么?

感谢任何帮助!

编辑

看起来我的设置是合法的,由于简化的测试环境,这属于异常但预期的行为类别。在企业场景中,根证书颁发机构不太可能直接为单个用户签署客户端证书。显然,在编写和测试这段代码时,信任链中至少有一个中间 CA。

【问题讨论】:

    标签: java tomcat x509


    【解决方案1】:

    您看到的是预期的结果:Chrome 没有发送 CA。

    在TSL Handshake when authenticating the client 期间,服务器将发送可接受的 CA 列表作为其 CertificateRequest 消息 (RFC) 的一部分,然后浏览器将显示由这些 CA 之一签名的证书。

    添加

    顺便说一句,调试 SSL 连接客户端的一个好方法是使用出色的 openssl 工具

    openssl s_client -connect ssl.server.com:443

    或仅适用于 SSLV3 的服务器

    openssl s_client -connect ssl.server.com:443 -ssl3

    这将打印(除其他外)可接受的 CA 列表。

    要调试服务器端,请将其添加到 JVM 命令行 -Djavax.net.debug=ssl

    【讨论】:

    • 感谢调试信息,帮了大忙。我期待在 servlet 请求中看到整个证书链一直到根 CA,但检查源代码表明它只是客户端发送的链。 RFC 说发件人可以选择省略根 CA 证书; Chrome、Firefox 和 IE9 都省略了根 CA(有趣的是,openssl 工具包含它)并且查看调试日志可以确认这一点。
    【解决方案2】:

    身份密钥库应包含 CA 签署的证书;不是自签名证书。 CA 根目录应该在信任库中。

    另外,第 4 步的目的是什么?

    【讨论】:

    • CA 根在信任库中。我正在使用一个单独的服务器身份证书,它也由 CA 根签名,它安装在 Tomcat 身份密钥库中。对不起,忘了提这个。第 4 步的目的是创建客户端在 SSL 握手中使用的身份证书。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多