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

时间:2012-03-23 02:42:33

标签: java tomcat x509

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

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

  1. 使用openssl生成自签名CA证书。
  2. 将CA证书作为受信任的根证书导入新创建的Java密钥库。
  3. 使用在步骤2中创建的密钥库将Tomcat HTTPS连接器配置为要求客户端身份验证作为信任库:
    • clientAuth="true"
    • truststoreFile="<path_to_truststore>"
  4. 使用openssl生成新的客户端证书,并使用CA证书对其进行签名。
  5. 启动Tomcat。
  6. 在Chrome中安装客户端证书并导航到我服务器的主页。在调试中逐步执行代码,我可以看到返回的数组只有javax.servlet.request.X509Certificate属性才有客户端证书。
  7. 我知道Tomcat正在从信任库中获取根CA证书,因为当我从信任库中删除它时,我收到SSL连接错误。它只是没有像文档所说的那样进入servlet请求。我在这里错过了任何其他配置吗?也许Tomcat(或Java或JSSE)期待一些额外的X509 V3扩展或什么?

    感谢任何帮助!

    修改

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

2 个答案:

答案 0 :(得分:3)

您所看到的是预期的内容:Chrome未发送CA.

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

添加

btw,调试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

答案 1 :(得分:0)

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

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