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

27

背景:

我正在更新一个内部应用程序,将其改为两步验证流程。我想在传统的用户名/密码表单上添加客户端证书认证过程(通过智能卡)。该应用程序使用C#编写,在IIS7上托管,并针对Chrome和IE8进行优化。

问题:

我在获取应用程序提示用户提供客户端证书时遇到了问题。我一直在使用Fiddler调试应用程序。当我在Fiddler的用户目录(C:\Documents and Settings\USER\My Documents\Fiddler2)中保存了一个测试客户端证书时,应用程序按预期工作。我会被提示输入保护智能卡的PIN码,输入正确后,就可以进入登录表单。但是,当我关闭Fiddler时,应用程序会抛出403禁止访问错误(因为Fiddler不再运行并指向其证书)。我还没有找到应用程序为什么不能正常提示证书的原因。

当前服务器设置:

  • 创建了自签名证书
  • 443绑定指向自签名证书
  • 启用匿名身份验证
  • 将自签名证书添加到受信任的根CA和中间CA(我读到另一个人在两个地方都有它,而不仅仅是受信任的根CA,这解决了他们的问题,但这两种设置都没有为我们工作)。
  • 我清除了不需要的受信任根CA中的其余证书(我在其他地方读到过,拥有太多证书会导致SSL出现故障)。

除了在另一个服务器上从头开始,我已经没有其他尝试的想法。有人知道可能是什么问题吗?这似乎应该是相当简单直接的,我可能缺少一些小东西。欢迎任何想法。

更新:

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

Chrome显示“访问网页被拒绝”的消息,而不是“403-禁止访问:拒绝访问”。我不知道这是否有帮助。我知道当我不需要证书时,该站点将按预期工作。要求证书就会失败。
应用程序池设置为.Net 4.0 |经典|网络服务。

不确定我能否帮忙,但有几个问题:1)您是否也尝试了IE或FF?2)可能需要在另一台服务器上复制结果。我见过太多通过这种方式得到帮助/解决问题的情况——这也将为您提供深入了解如何设置IIS7站点的机会;3)是否有更多客户端和/或服务器日志可以尝试以获得更多见解——似乎更多是在IIS7方面。 - Lizz
9个回答

13

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


13
你的问题是浏览器没有收到请求提供客户端证书,或者有一个与安全相关的选项来阻止它发生。如果网站位于正确的区域(内部网络或受信任的网站),IE才会提供证书。请在开始之前检查这一点。
如果这不起作用,请参考answer以进行下一步操作。netsh文档中说:
clientcertnegotiation
Optional. Specifies whether the negotiation of certificate is enabled or disabled. Default is disabled.

启用此选项,即使最简单的浏览器也应该注意到它应该提供证书进行身份验证。要进一步诊断问题,您可以使用WireShark查看协商过程。


我无法为此点赞足够多。经过数天的故障排除,结果发现我们的客户没有将我们的网站放入受信任的区域。感谢您的解释,让我节省了更多的时间。 - Emil Stenström

12

尝试 openssl s_client -connect yourip:443 -prexit 命令,并查看证书是否被发送到可接受客户端证书 CA 名称中。

如果您还未安装 openssl,需要先安装它。


我遇到了类似的问题,所以我尝试了 openssl s_client -connect yourip:443 -prexit 命令,并且看到了一些错误信息 `CONNECTED(00000104) write:errno=10054

no peer certificate available`,即使我已经在 IIS 上将有效的 SSL 证书配置到 *:443。
- OTUser
3
如果您使用的是Windows计算机,请注意OpenSSL无法识别Windows证书存储。因此,您需要提供“-CApath”或“-CAfile”。您可以从所需的链中下载Mozilla的.PEM文件或创建自己的文件。确保还安装了最新版本的OpenSSL。 - Aske B.

4

我建议您尝试重新启动浏览器,特别是在安装证书时浏览器仍在运行。


3
为了给这个混合体添加一个相当痛苦的教训:请确保退出Skype(或任何其他占用443端口的应用程序)。
所以,这里的想法是,如果您在同一台机器上运行开发环境(客户端和IIS),并且您的团队使用Skype或其他应用程序进行通信。
当您尝试调试此问题时,看着时间慢慢流逝,似乎做了一切“正确”的事情,例如netsh http sslcerts等,甚至重新启动但无济于事。 好吧,结果发现Skype会占用443端口,因此关闭它,“咻”您的证书提示就消失了。
然后可以自由地将东西扔到墙上,大喊脏话或者只是“愤怒,愤怒地对抗光明的消逝”。

1

此外,请确保Fiddler没有干扰。如果您让它解密SSL,它会破坏消息返回到IE,并且它没有安装证书,因此无法提供证书。关闭Fiddler,然后就会出现证书提示。


1
在Firefox中,如果你第一次被提示输入证书时按下“取消”并勾选了“记住此决定”的框,那么Firefox将会记住这个决定并不再提示。你可以在Firefox的设置中查看和删除之前记住的决定:选择“隐私与安全”(about:preferences#privacy),然后进入“查看证书”,检查“身份验证决策”选项卡。请注意保留HTML标签。

1
非常感谢您提供的信息,您让客户感到满意,也让我的工作更加轻松。这对我帮助很大,解决了一个问题。 - Annemarie Rinyu

0
对我来说,NordVPN是个问题。"Web保护"功能阻止了客户端证书提示。

0

只需连接到我的 VPN 并尝试,就会显示证书提示。这只需要在第一次完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接