我正在尝试为我们的应用程序设置一个测试环境,该环境在Tomcat 6.0中通过HTTPS使用X.509客户端身份验证。 servlet代码期望使用servlet请求的X509Certificate
将证书链作为javax.servlet.request.X509Certificate
对象的数组获取。但是,此数组只包含一个项目(客户端证书),我希望它有两个(客户端证书和签署它的根CA证书)。
这是我到目前为止所做的:
clientAuth="true"
truststoreFile="<path_to_truststore>"
javax.servlet.request.X509Certificate
属性才有客户端证书。我知道Tomcat正在从信任库中获取根CA证书,因为当我从信任库中删除它时,我收到SSL连接错误。它只是没有像文档所说的那样进入servlet请求。我在这里错过了任何其他配置吗?也许Tomcat(或Java或JSSE)期待一些额外的X509 V3扩展或什么?
感谢任何帮助!
修改
看起来我的设置是合法的,由于简化的测试环境,这属于不寻常但预期的行为类别。在企业方案中,根证书颁发机构不太可能直接为单个用户签署客户端证书。显然,当编写和测试此代码时,信任链中至少涉及一个中间CA.
答案 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步的目的是什么?