【问题标题】:Browser is not prompting for a client certificate浏览器不提示输入客户端证书
【发布时间】:2013-02-07 11:41:17
【问题描述】:

背景:

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

【问题讨论】:

  • 不确定我是否可以帮忙,但有几个问题:1) 你也尝试过 IE 或 FF 吗? 2) 可能想在另一台服务器上复制结果。我已经看到太多的问题通过这种方式得到了帮助/解决——它也让你有机会深入了解你的 IIS7 站点是如何设置的; 3) 是否有更多的客户端和/或服务器日志记录您可以尝试获得更多的洞察力 - 似乎更多的是在 IIS7 方面。

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


【解决方案1】:

您的问题是浏览器要么没有收到提供客户端证书的请求,要么没有与安全相关的选项来阻止它发生。 IE 仅在网站位于正确区域(内联网或受信任的站点)时才提供证书。请在一切之前检查这一点。

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

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

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

【讨论】:

  • 我对此赞不绝口。经过几天的故障排除后,事实证明我们的客户没有将我们的站点置于受信任区域。感谢您解释这一点并为我节省了几天时间。
【解决方案2】:

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

如果没有,需要先安装openssl

【讨论】:

  • 我遇到了类似的问题,所以我尝试了openssl s_client -connect yourip:443 -prexit 并看到一些错误消息CONNECTED(00000104) write:errno=10054 --- no peer certificate available,即使我已在 IIS 上将有效的 SSL 证书配置为 *:443。
  • @RanPaul 我知道这已经很晚了,但是如果您使用的是 Windows 机器,请注意 OpenSSL 无法识别 Windows 证书存储。所以您需要提供-CApath-CAfile。下载Mozilla's .PEM file 或从所需的链中创建您自己的。确保同时安装latest version of OpenSSL
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    要给这个组合增加一个相当痛苦的教训:确保退出占用端口 443 的 Skype(或任何其他应用程序)。

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

    当您尝试调试此问题时,请注意时间的流逝,似乎一切都“正确”,netsh http sslcerts 等等,甚至重新启动但无济于事。好吧,原来 Skype 会吃掉 443,所以把它关掉,然后“噗”地出现你的证书提示。

    然后随意向墙上扔东西,大喊脏话或只是“愤怒,愤怒反对光的消亡”。

    【讨论】:

      【解决方案5】:

      另外,请确保 Fiddler 不会妨碍您。如果你让它解密 SSL,它会将消息损坏回 IE,并且它没有安装证书,所以它不能提供它。关闭fiddler,瞧,出现证书提示。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          在 Firefox 中,如果您在第一次系统提示您输入证书时按“取消”,并且您将偷偷摸摸的“记住此决定”框选中,那么 Firefox 会记住这一点并且不再提供它。

          您可以在 Firefox Preferences -> Privacy & Security (about:preferences#privacy) 查看和删除您之前记住的决定,查看证书,并检查 Authentication Decisions 选项卡。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-01
            相关资源
            最近更新 更多