我正在尝试设置客户端证书身份验证。我能够生成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/...
。
UPDATE2: 使用Wireshark我注意到服务器的响应取决于客户端:
Fiddler(好):
Client Hello
Server Hello, Certificate, Server Hello Done
浏览器(不行):
Client Hello
Server Hello, Change Cipher Spec, Encrypted Handshake Message
UPDATE3:
启用clientcertnegotiation
后,服务器响应不同但仍无效:
Server Hello, Certificate
Certificate Request
Certificate, Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
我的自签名CA似乎不在“专有名称”列表中......
UPDATE4:
SSL设置:选中Require SSL
,将客户端证书设置为Required
。客户端证书显示在“个人”中,预期目的是“客户端身份验证”。
答案 0 :(得分:2)
我终于找到了问题和解决方法:
如Update3中所述,Distinguished Names
不包含我的CA.这是因为Distinguished Names
的限制为2 ^ 14字节(16384字节)。因为我的机器上安装了很多CA,我的CA根本没有安装.TLS标准允许发送多条消息,但遗憾的是Windows不支持这种消息!
正如前面提到的here,你有几种可能性。最简单的是:
在您的服务器上,在DWORD
下的注册表中添加名为QWORD
的{{1}}(不是SendTrustedIssuerList
!)值,并将其设置为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
。这将阻止您的服务器发送列表,让客户端从任何已安装的客户端证书中进行选择。
不幸的是,我在事件查看器中看不到任何痕迹(如其他地方所述)。因此,问题不容易发现(我必须使用Wireshark来检查0
)。
答案 1 :(得分:0)
客户端证书。 CA证书应位于 LocalMachine \ Root 存储中,以便IIS信任CA颁发的所有证书,并且CA对计算机上的每个用户都是可信任的。
CA颁发的CRL 应可通过网址(在CA发布的每个最终实体证书中指定)或在 LocalMachine \ My < strong>商店。
注意:openssl不使用Windows证书存储区,因此openssl s_client -connect 127.0.0.1:443 -state
答案 2 :(得分:0)
使用“接受”选项代替&#34;客户端证书&#34;的“需要”选项;特征。
在IIS管理器中,找到要为其更改SSL设置的Web应用程序。
在“功能视图”中,双击“SSL设置”。
在SSL设置页面上,选择客户端证书下的接受选项。
在“操作”窗格中,单击“应用”。