背景:
我更新内部应用程序的两步验证过程。 我想在传统的用户名/密码表单上添加一个客户端证书认证过程(通过智能卡)。 该应用程序是用C#编写,在IIS7主办,定位于Chrome和IE8。
问题:
我有让应用程序提示输入客户端证书的用户的问题。 我一直在调试使用Fiddler的帮助下应用。 当我保存在提琴手的用户目录下的测试客户端证书(C:\ Documents和Settings \ USER \我的文档\ Fiddler2),应用程序正常工作。 提示我输入一个PIN码保护的智能卡,并输入正确的时候,带我到登录表单。 当我关闭提琴手,应用程序将引发403禁止错误,而不是(因为提琴手不再运行,并指向其证书)。 我一直没能搞清楚的是为什么应用程序不会提示证书正常。
当前服务器设置:
- 自签名证书的创建
- 443绑定指向自签名证书
- 匿名身份验证已启用
- 签名证书的自加入这两个受信任的根CA和中级CA(我读了另一个人有它在两个而不是只受信任的根CA和解决他们的问题,但双方建立为我们工作)。
- 我清空了受信任的根CA证书,我没有需要(我看过其他地方有太多的证书会导致SSL呛)的其余部分。
我的想法不是从头开始另一台服务器上的其他尝试。 有谁知道这个问题可能是什么? 这似乎是它应该是相当简单的和我想的东西未成年人。 任何想法都欢迎。
更新:
今天花更多的时间与这个问题后,我强烈相信这与IIS7没有被正确配置的话(我没有设置它最初)。 我想这是因为我启用失败请求跟踪,看着正在产生后续的.xml文件,看到了被抛出一个500错误。
Chrome正在扔“到网页访问被拒绝”的消息,而不是一个“403 - 禁止访问:访问被拒绝”。 我不知道这是否有助于。 我不知道,当我不作要求的证书,如预期该网站将工作。 需要的证书是它失败。
应用程序池设置为.NET 4.0 | 经典| 网络服务。
你的问题是,浏览器不要么得到提供客户端证书或者存在与安全相关的选项,从发生阻止它的请求。 IE只提供,如果网站是在正确的区域(内联网或受信任的站点)证书。 一切之前,请检查。
如果没有帮助,然后看到这个答案下一步骤。 在netsh文档说:
clientcertnegotiation
Optional. Specifies whether the negotiation of certificate is enabled or disabled. Default is disabled.
启用就连最愚蠢的浏览器应该注意到,它应该提供证书进行身份验证。 要诊断您的问题,进一步您可以使用Wireshark的 ,看在行动的谈判。
尝试openssl s_client -connect yourip:443 -prexit
,看看CA(你的自签名证书)被发送到客户端在可接受的客户端证书CA的名称。
你需要首先安装OpenSSL的,如果你没有它
在每一个我所见过的浏览器,浏览器不会提示您选择一个证书,如果它没有通过CA服务器信任签名的任何证书。 因此,请确保您的服务器配置了正确的CA. 作为Boklucius建议,您可以使用OpenSSL检查信任的CA服务器在发送给客户的名单,看看你是否CA签署了客户端证书与在他们中间。
一个相当惨痛的教训加进来:确保你退出Skype(或任何其他应用程序)吃端口443。
所以,这里的想法是,如果你正在运行在同一台机器(客户端和IIS)上的开发环境,以及您的团队使用的Skype或其他一些应用程序进行通信。
观看时间的流逝,当你试图和调试这个问题,看似做的一切“右”, netsh http sslcerts
和这样的,即使重新启动,但无济于事。 那么,原来的Skype会吃443因此将其关闭,“噗”有云您的证书提示。
然后随意在墙上扔东西,喊淫秽或只是“愤怒,怒斥光明的消逝”。
我会扔在一个“尝试重新启动浏览器”的建议,特别是如果您在浏览器正在运行安装证书。
此外,确保提琴手不凑了过来。 如果你拥有了它解密SSL,它会破坏信息返回到IE浏览器,并没有安装证书,所以它不能提供它。 关闭小提琴手,瞧,出现证书提示。