【发布时间】:2012-04-07 16:11:19
【问题描述】:
我正在尝试为我们的应用程序设置一个测试环境,该环境在 Tomcat 6.0 中通过 HTTPS 使用 X.509 客户端身份验证。 servlet 代码期望使用 servlet 请求的 javax.servlet.request.X509Certificate 将证书链作为 X509Certificate 对象的数组。但是,这个数组只包含一个项目(客户端证书),我希望它有两个(客户端证书和签署它的根 CA 证书)。
这是我到目前为止所做的:
- 使用 openssl 生成自签名 CA 证书。
- 将 CA 证书作为受信任的根证书导入新创建的 Java 密钥库。
- 将 Tomcat HTTPS 连接器配置为要求使用在步骤 2 中创建的密钥库作为信任库进行客户端身份验证:
clientAuth="true"truststoreFile="<path_to_truststore>"
- 使用 openssl 生成新的客户端证书并使用 CA 证书对其进行签名。
- 启动 Tomcat。
- 在 Chrome 中安装客户端证书并导航到我的服务器主页。单步调试代码,我可以看到以
javax.servlet.request.X509Certificate属性返回的数组只有客户端证书。
我知道 Tomcat 正在从信任库中获取根 CA 证书,因为当我从信任库中删除它时,我收到 SSL 连接错误。它只是没有像文档所说的那样将其放入 servlet 请求中。我在这里缺少任何其他配置吗?也许 Tomcat(或 Java 或 JSSE)期待一些额外的 X509 V3 扩展或什么?
感谢任何帮助!
编辑
看起来我的设置是合法的,由于简化的测试环境,这属于异常但预期的行为类别。在企业场景中,根证书颁发机构不太可能直接为单个用户签署客户端证书。显然,在编写和测试这段代码时,信任链中至少有一个中间 CA。
【问题讨论】: