我正在尝试设置客户端证书身份验证。我能够生成 CA、服务器和客户端证书。只要我使用 Fiddler,一切都会按预期进行。但是,一旦我开始使用浏览器,它就不再工作了(HTTP 错误 403.7 - 禁止访问)。
当然,我在个人存储中导入了客户端证书,并确保启用了客户端证书协商。
我也试过 openssl s_client -connect 127.0.0.1:443 -state -debug
但我无法真正理解结果......唯一奇怪的是我的 CA 没有不会出现在 Acceptable client certificate CA names
部分。
还有什么我可以尝试的吗?
更新:
我认为没关系,但我的服务器证书是为 127.0.0.1 设置的。因此,我在浏览器中使用 https://127.0.0.1/...
。
更新 2: 使用 Wireshark 我注意到我的服务器的响应取决于客户端:
fiddler (好的):
Client Hello
Server Hello, Certificate, Server Hello Done
浏览器(不正常):
Client Hello
Server Hello, Change Cipher Spec, Encrypted Handshake Message
更新 3:
启用 clientcertnegotiation
后,服务器响应不同但仍然不起作用:
Server Hello, Certificate
Certificate Request
Certificate, Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
我的自签名 CA 似乎不在可分辨名称列表中...
更新4:
SSL 设置:选中 Require SSL
并将客户端证书设置为 Required
。客户端证书显示在个人中,预期目的是客户端身份验证。
最佳答案
我终于找到了问题和解决方法:
如 Update3 中所述,可分辨名称
不包含我的 CA。这是因为 Distinguished Names
有 2^14 字节(16384 字节)的限制。因为我的机器上确实安装了很多 CA,所以我的 CA 根本没有安装进去。TLS 标准允许发送多条消息,但不幸的是 Windows 不支持这个!
如前所述here你有几种可能性。最简单的是这样的:
在您的服务器上,在您的注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet 下添加一个名为
并将其设置为 SendTrustedIssuerList
的 DWORD
(不是 QWORD
!)值\Control\SecurityProviders\SCHANNEL0
。这将完全阻止您的服务器发送列表,让客户端从任何已安装的客户端证书中进行选择。
不幸的是,我在事件查看器中看不到任何痕迹(如其他地方所报告)。因此这个问题不容易发现(我不得不使用 Wireshark 来检查 Distinguished Names
)。
关于ssl - 浏览器不应用客户端证书 : 403. 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786762/