我正在尝试为在JBoss 4.2.3上运行的SOAP Web服务设置双向SSL身份验证。我们为此目的创建了一个CA,它具有根CA和两个中间CA-s(开发和生产环境)。
然而,尝试使用由其中一个CA-s签名的客户端证书来测试此设置时,我遇到了问题。
服务器设置为JVM-s cacerts
密钥库中的根CA和Tomcat连接器用作信任库的密钥库中的相关中间CA.完整的Connector配置如下:
<Connector port="443" address="${jboss.bind.address}"
protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="keystore.p12"
keystorePass="******" keystoreType="PKCS12"
emptySessionParth="true" enableLookups="false" acceptCount="100"
truststoreFile="truststore.jks"
truststorePass="******" truststoreType="JKS"
disableUploadTimeout="true" />
与openssl s_client
连接我可以看到,&#34;可接受的客户端证书CA名称&#34;列出我们的中间CA.我还在-cert
和-key
选项中提供了正确的客户端证书和密钥。但是,据我所知,openssl输出,永远不会发送证书。我还尝试将客户端证书,中间CA和根CA连接到一个PEM文件中,以呈现整个链,但这也没有帮助。
s_client命令行如下:
openssl s_client -host localhost -port 443 -cert client_cert.crt -key client_key.key -CApath /etc/ssl/certs/ -debug -state
当我尝试使用Google Chrome和Windows中安装的相关证书测试服务时,也会观察到相同的行为。 wireshark输出看起来相同 - 请求证书,显示正确的可接受CA,但浏览器甚至从未给我选择证书,并且空的客户端证书消息被发送回服务器。
所以我的问题是 - 我在这里错过了什么?我假设客户端应该使用可接受的CA列表来决定要发送哪些证书,但显然有些事情正在做出决定,否则就不会发送证书。我再次假设服务器配置正确,因为预期的CA是在协商中发送的,但我在客户端缺少什么?
编辑:
根据要求@Bruno,我还查看了证书的密钥用法。当使用openssl x509 -noout -text -in client.cer
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Key Usage: critical
.....
X509v3 Extended Key Usage:
TLS Web Client Authentication
现在看一下 - 空的Key Usage字段似乎是罪魁祸首。应该有什么价值?我似乎无法找到谷歌获取此类信息的好词。我可能不得不查看CA管理软件。
答案 0 :(得分:0)
感谢@Bruno给出的提示,我调查了客户端证书的关键用法部分。事实证明,我们正在生成具有空密钥用法属性的证书。
我现在已经配置了我们的CA管理软件,以生成具有以下密钥用法/扩展密钥用法属性的证书。我承认我并不完全明白,每个人都做了什么,但它使系统现在正常运作。希望我在这里没有添加任何有潜在危险的东西。
X509v3 Key Usage: critical
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment, Key Agreement
X509v3 Extended Key Usage:
TLS Web Client Authentication
在谷歌上搜索有关密钥使用位的信息之后,我也偶然发现了this question,它解释了一些事情。