ssl - 浏览器不应用客户端证书 : 403. 7

标签 ssl ssl-certificate authentication

我正在尝试设置客户端证书身份验证。我能够生成 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 下添加一个名为 SendTrustedIssuerListDWORD(不是 QWORD!)值\Control\SecurityProviders\SCHANNEL 并将其设置为 0。这将完全阻止您的服务器发送列表,让客户端从任何已安装的客户端证书中进行选择。

不幸的是,我在事件查看器中看不到任何痕迹(如其他地方所报告)。因此这个问题不容易发现(我不得不使用 Wireshark 来检查 Distinguished Names)。

关于ssl - 浏览器不应用客户端证书 : 403. 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786762/

相关文章:

api - 使用 OAuth 和 PEAR Services_Twitter 获取 Twitter 请求 token 时出错

linux - Docker 错误 : Could not connect to deb. debian.org(111:连接被拒绝)

firefox - 为什么 Firefox 说我的网站正在使用 "invalid security certificate"?

SSL 证书不适用于 safari

c# - 动态添加具有指向动态生成的自签名证书的 HTTPS 绑定(bind)的网站

java - "javax.servlet.request.X509Certificate"请求属性不返回CA证书

python - Django身份验证错误: 'str' object has no attribute 'pk'

authentication - 是否可以使用 MSAL.js 来获取刷新 token ?

ssl - 如何使用 nginx 反向代理在同一端口上从 http 重定向到 https

java - JSF 2.0 : How to submit a form securely on a HTTP page