12

背景:浏览器不提示输入客户端证书

我更新的内部应用到了两步认证处理。我想在传统的用户名/密码表单上添加客户端证书身份验证过程(通过智能卡)。该应用程序使用C#编写,托管在IIS7上,并针对Chrome和IE8。

问题:

我有让应用程序提示输入客户端证书的用户的问题。我一直在Fiddler的帮助下调试应用程序。当我有一个保存在Fiddler用户目录(C:\ Documents and Settings \ USER \ My Documents \ Fiddler2)中的测试客户端证书时,应用程序按预期工作。系统会提示输入保护智能卡的PIN号码,并且输入正确后,会将我带到登录表单。当我关闭Fiddler时,应用程序会抛出403 Forbidden错误(因为Fiddler不再运行并指向其证书)。我无法弄清的是为什么应用程序不会正常提示输入证书。

当前服务器设置:

  • 自签名证书创建
  • 443绑定在自签名证书指向
  • 匿名认证功能
  • 签名证书的自加入两受信任的根CA和中级CA(我读了另一个人在两个版本中都拥有它,而不仅仅是受信任的根CA,并且解决了他们的问题,但这两个设置都不适用于我们)。
  • 我清除了我不需要的受信任根CA中的其余证书(我在其他地方读过,有太多证书会导致SSL窒息)。

我没有想法尝试,而不是从头开始在另一台服务器上。有谁知道这个问题可能是什么?这看起来应该是相当直接的,我错过了一些小事。任何想法都欢迎。

更新:

今天花更多的时间与这个问题后,我强烈相信这与IIS7没有被正确配置的话(我没有设置它最初)。我认为这是因为我启用了失败的请求跟踪,查看了正在生成的后续.xml文件,并看到引发了500错误。

Chrome正在抛出“拒绝访问网页”消息,而不是“403 - 禁止访问:访问被拒绝”。我不知道这是否有帮助。我知道,当我不需要证书时,网站将按预期工作。要求证书是失败的地方。

应用程序池设置为.Net 4.0 |经典|网络服务。

+0

不知道我可以帮忙,但有几个问题:1)你是否尝试过IE或FF? 2)可能想在另一台服务器上复制结果。我已经看到了很多帮助/解决这个问题的问题 - 它也让您有机会了解IIS7网站的设置; 3)是否有更多的客户端和/或服务器日志可以尝试获得更多的见解 - 看起来可能更多在IIS7方面。 – Lizz 2013-03-01 21:47:36

回答

7

问题是,浏览器既没有获得提供客户端证书的请求,也没有安全相关的选项来阻止它发生。 IE仅在网站位于正确区域(Int​​ranet或可信站点)时才提供证书。请检查一切之前。

如果这没有帮助,那么请参阅此answer下一步。在netsh文件说:

clientcertnegotiation 
Optional. Specifies whether the negotiation of certificate is enabled or disabled. Default is disabled. 

启用该连最笨的浏览器应该注意到,它应该提供证书进行身份验证。要进一步诊断您的问题,您可以使用WireShark来查看正在进行的协商。

+0

我不能满足这个。经过几天的排除故障后,我们的客户并未将我们的网站置于受信任区域。感谢您解释这一点并为我节省更多的时间。 – 2016-02-19 11:52:50

4

尝试openssl s_client -connect yourip:443 -prexit 然后查看CA(您的自签名证书)是否发送给可接受客户端证书CA名称中的客户端。

您需要首先安装OpenSSL的,如果你没有它

+0

我有类似的问题,所以我尝试了'openssl s_client -connect yourip:443 -prexit',并且看到一些错误信息'CONNECTED(00000104) write:errno = 10054 --- 没有对等证书可用,尽管我已在IIS上将有效的SSL证书配置为*:443。 – RanPaul 2016-01-21 15:45:43

+0

@RanPaul我知道这很晚了,但是如果你在Windows机器上,请注意OpenSSL不能识别Windows证书存储。所以你需要提供'-CApath'或'-CAfile'。您可以下载[Mozilla的.PEM文件](https://curl.haxx.se/docs/caextract.html),或者从需要的链中创建您自己的。确保安装[最新版本的OpenSSL](https://slproweb.com/products/Win32OpenSSL.html)。 – 2018-02-27 08:47:08

3

在每一个浏览器我见过你,浏览器不会提示您选择一个证书,如果它不具有CA签署的任何证书服务器信任。所以请确保您的服务器配置了正确的CA。正如Boklucius建议的那样,您可以使用openssl来检查服务器发送给客户端的可信CA列表,并查看您是否签有客户端证书的CA。

1

一个相当惨痛的教训加进来:确保你退出Skype(或任何其他应用程序)吃端口443

所以这里的想法是,如果你正在运行在同一台机器上的开发环境(客户端和IIS),并且您的团队使用Skype或其他应用进行通信。

当你尝试和调试这个问题时,看着时间过去,似乎做的一切都是“正确的”,netsh http sslcerts等,甚至重新启动,但无济于事。那么,事实证明,Skype会吃掉443,所以关掉它,“噗”的出现你的证书提示。

然后随意把东西扔在墙上,大声嚷嚷或只是“愤怒,愤怒反对死亡的光明”。

0

另外,请确保Fiddler不会妨碍您。如果你对SSL进行解密,它会将该消息破坏回IE,并且它没有安装证书,所以它不能提供它。关掉小提琴手,瞧,证书提示出现。