浏览器未提示输入客户端证书

时间:2013-02-21 23:34:30

标签: authentication iis-7 windows-server-2008 smartcard client-certificates

背景:

我正在将内部应用程序更新为两步验证过程。我想在传统的用户名/密码表单之上添加客户端证书身份验证过程(通过智能卡)。该应用程序使用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 |经典|网络服务。

6 个答案:

答案 0 :(得分:9)

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

如果这没有帮助,请查看此answer以了解下一步。 netsh文档说:

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

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

答案 1 :(得分:7)

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

如果你没有openssl,你需要先安装openssl

答案 2 :(得分:5)

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

答案 3 :(得分:2)

为混合添加一个相当痛苦的教训:确保您退出吃掉端口443的Skype(或任何其他应用程序)。

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

在您尝试调试此问题时,请注意几个小时,看似正在做所有事情"正确",netsh http sslcerts等等,甚至重新启动但无济于事。好吧,结果Skype会吃443所以关掉它" poof"你的证书提示。

然后随意把东西扔在墙上,喊出猥亵或只是"愤怒,愤怒对抗光的死亡"

答案 4 :(得分:1)

我会提出“尝试重新启动浏览器”的建议,尤其是如果您在浏览器运行时安装了证书。

答案 5 :(得分:0)

另外,请确保Fiddler不会妨碍您。如果您解密SSL,它会将消息损坏回IE,并且它没有安装证书,因此它无法提供。关闭提琴手,然后出现证书提示。