我在 Windows 上运行 Apache 2.2,mod_ssl 运行良好,可以提供商业签名的服务器证书。(通配符证书,尽管我认为这并不重要。)
我正在尝试让某些 VirtualHosts 上的服务器要求提供客户端证书,因此我构建了一个包含 PEM 的 SSLCACertificateFile;据我了解,应该在 SSL 建立期间提供签名 DN 列表以供客户端响应。
我有一个 StartSSL 个人身份证书,如果我将 StartSSL 的根证书放入 SSLCACertificateFile,浏览器(已测试 Chrome 和 IE)会弹出“选择证书”并显示我的 StartSSL 证书。
然而,我真正的用例是使用我自己的 CA,并签署客户端证书,并且那是我无法正常工作。我自行签署 CA,然后创建客户端 CSR 并使用 CA 证书对其进行签署,并将其加载到我的客户端证书存储中,然后我将 CA PEM 放入我的 SSLCACertificateFile 中 - 并且浏览器在“选择证书”中不提供客户端证书。
什么鬼。
因为这一切都与 StartSSL CA 和证书有关,所以我想知道这是否实际上是我的 CA 证书或客户端证书的问题——但我无法弄清楚问题可能是什么;CA 证书用于签名,并且具有 CA:TRUE;客户端证书以客户端身份验证为目的……缺少了什么。
不确定如何诊断;谢谢。
这是我的 CA PEM,粘贴到 SSLCACertificateFile 中:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
bf:45:a7:db:f9:8e:8f:d0
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, ST=California, L=San Diego, O=TestCA, OU=TestCA-OU, CN=TestCA-CN
Validity
Not Before: Mar 8 21:39:52 2013 GMT
Not After : Apr 7 21:39:52 2013 GMT
Subject: C=US, ST=California, L=San Diego, O=TestCA, OU=TestCA-OU, CN=TestCA-CN
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
<snip>
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
5E:99:47:8A:52:D3:38:20:68:A5:91:D9:E1:2E:6B:50:0D:5C:98:CB
X509v3 Authority Key Identifier:
keyid:5E:99:47:8A:52:D3:38:20:68:A5:91:D9:E1:2E:6B:50:0D:5C:98:CB
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
<snip>
...这是客户端证书:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 20481 (0x5001)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, ST=California, L=San Diego, O=TestCA, OU=TestCA-OU, CN=TestCA-CN
Validity
Not Before: Mar 8 23:46:55 2013 GMT
Not After : Mar 8 23:46:55 2014 GMT
Subject: C=US, ST=California, L=San Diego, O=TestClient, OU=TestClient-OU, CN=TestClient-CN
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
<snip>
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication
Signature Algorithm: sha1WithRSAEncryption
<snip>
/****************************************************************************/
根据 Mike 的要求提供更多信息(我尝试了几次才让“openssl s_client”正常运行。)
结果如下:[...]
---
Acceptable client certificate CA names
/C=UK/O=Test Certificates/CN=Test CA
/C=US/ST=California/L=San Diego/O=TestCA/OU=TestCA-OU/CN=TestCA-CN
/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certific
ation Authority
---
[...]
所以,服务器说
/C=美国/ST=加利福尼亚/L=圣地亚哥/O=TestCA/OU=TestCA-OU/CN=TestCA-CN
是可接受的客户端证书,并且客户端已
发行人:C=US、ST=加利福尼亚、L=圣地亚哥、O=TestCA、OU=TestCA-OU、CN=TestCA-CN
在它的商店里——但浏览器没有把它列入我可以选择的列表中。浏览器做提供由以下人员签名的客户端证书
/C=英国/O=测试证书/CN=测试 CA
和
/C=IL/O=StartCom Ltd./OU=安全数字证书签名/CN=StartCom 认证机构
...让我回想起“WTF?”
答案1
是的,我正在回答我自己的问题。
解决了。
事实证明,这KeyUsage keyEncipherment
不是 SSL/TLS 客户端的正确 keyUsage。正确的 KeyUsage 约束是KeyUsage digitalSignature
;有用的信息在这篇 Mozilla 文章。