背景:
我正在将内部应用程序更新为两步身份验证过程。我想在传统的用户名/密码表单之上添加客户端证书身份验证过程(通过智能卡)。该应用程序是用 C# 编写的,托管在 IIS7 上,面向 Chrome 和 IE8。
问题:
我在让应用程序提示用户输入客户端证书时遇到问题。我一直在 Fiddler 的帮助下调试该应用程序。当我将测试客户端证书保存在 Fiddler 的用户目录 (C:\Documents and Settings\USER\My Documents\Fiddler2) 中时,应用程序按预期工作。系统会提示我输入保护智能卡的 PIN 码,输入正确后,会进入登录表单。当我关闭 Fiddler 时,应用程序会抛出 403 Forbidden 错误(因为 Fiddler 不再运行并指向其证书)。我无法弄清楚为什么应用程序不会正常提示输入证书。
当前服务器设置:
- 自签名证书已创建
- 443 绑定(bind)指向自签名证书
- 已启用匿名身份验证
- 自签名证书已添加到受信任的根 CA 和中间 CA 中(我读到另一个人在这两个 CA 中都添加了该证书,而不仅仅是受信任的根 CA,这解决了他们的问题,尽管这两种设置都对我们不起作用) .
- 我清除了受信任根 CA 中不需要的其余证书(我在其他地方读到证书过多会导致 SSL 阻塞)。
除了在另一台服务器上从头开始之外,我没有其他尝试的想法。有谁知道问题可能是什么?这看起来应该是相当简单的,但我遗漏了一些小东西。欢迎任何想法。
更新:
今天花了更多时间解决这个问题后,我坚信这与 IIS7 配置不正确有关(我最初没有设置它)。我认为这是因为我启用了失败请求跟踪,查看了生成的后续 .xml 文件,并发现抛出了 500 错误。
Chrome 抛出“访问网页被拒绝”消息,而不是“403 - 禁止:访问被拒绝”消息。我不知道这是否有帮助。我确实知道,当我不要求提供证书时,该网站将按预期运行。需要证书是失败的地方。
应用程序池设置为.Net 4.0 |经典|网络服务。
最佳答案
您的问题是浏览器没有收到提供客户端证书的请求,或者有一个与安全相关的选项来阻止它发生。仅当网站位于正确的区域(Intranet 或受信任的站点)时,IE 才会提供证书。请在一切之前检查这一点。
如果这没有帮助,请查看此 answer进行下一步。 netsh 文档说:
clientcertnegotiation
Optional. Specifies whether the negotiation of certificate is enabled or disabled. Default is disabled.
启用该功能,即使是最愚蠢的浏览器也应该注意到它应该提供用于身份验证的证书。要进一步诊断您的问题,您可以使用 WireShark看看谈判正在进行中。
关于authentication - 浏览器不提示输入客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15014288/