背景:
我正在将内部应用程序更新为两步验证过程。我想在传统的用户名/密码表单之上添加客户端证书身份验证过程(通过智能卡)。该应用程序使用C#编写,托管在IIS7上,并以Chrome和IE8为目标。
问题:
我遇到了让应用程序提示用户输入客户端证书的问题。我一直在Fiddler的帮助下调试应用程序。当我在Fiddler的用户目录(C:\ Documents and Settings \ USER \ My Documents \ Fiddler2)中保存测试客户端证书时,应用程序按预期工作。系统提示我输入保护智能卡的PIN码,输入正确后,会将我带到登录表单。当我关闭Fiddler时,应用程序会抛出403 Forbidden错误(因为Fiddler不再运行并指向其证书)。我无法弄清楚的是,为什么应用程序不会正常提示证书。
当前服务器设置:
除了在另一台服务器上从头开始尝试之外,我没有想法。有谁知道问题可能是什么?这似乎应该是相当直接的,我错过了一些小事。任何想法都受到欢迎。
更新
今天在这个问题上花了更多的时间后,我坚信它与IIS7没有正确配置有关(我最初没有设置它)。我想这是因为我启用了失败的请求跟踪,查看了生成的后续.xml文件,并看到引发了500错误。
Chrome正在抛出“访问网页被拒绝”消息,而不是“403 - 禁止访问:访问被拒绝”。我不知道这是否有帮助。我知道,当我不需要证书时,该网站将按预期工作。要求证书是失败的地方。
应用程序池设置为.Net 4.0 |经典|网络服务。
答案 0 :(得分:9)
您的问题是浏览器既没有获得提供客户端证书的请求,也没有安全相关的选项来阻止它发生。仅当网站位于正确的区域(Intranet或可信站点)时,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,并且它没有安装证书,因此它无法提供。关闭提琴手,然后出现证书提示。