java - 无法从 Tomcat 中的客户端获取 X509 根证书

标签 java tomcat x509

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

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

  1. 使用 openssl 生成自签名 CA 证书。
  2. 将 CA 证书作为受信任的根证书导入新创建的 Java keystore 。
  3. 将 Tomcat HTTPS 连接器配置为要求使用在第 2 步中创建的 keystore 作为信任库进行客户端身份验证:
    • 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 参与了信任链。

最佳答案

您看到的是预期的结果: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

关于java - 无法从 Tomcat 中的客户端获取 X509 根证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9833465/

相关文章:

Java - 使用 SSH 隧道连接到网页

java - 使用 POI 迭代 Excel 文件时如何跳过空白单元格值并选取下一个单元格

java - 国际象棋中达到目标的最少步数 - 使用 BFS 进行马遍历

java - IntelliJ 结构搜索正则表达式问题

spring - Cloudbees、Tomcat 和 Spring : "Cannot create JDBC driver of class ' ' for connect URL 'null' "

tomcat - 在 Tomcat 7 下更改 Apache Jackrabbit 的日志级别

java - Spring Scheduler 意外停止

content-management-system - 识别未知的 ASN.1 对象

c - Openssl:在 SSL_CTX_load_verify_locations API 中使用 CApath 参数时证书验证失败

c++ - 将证书链获取到私有(private)根