ASP.NET Request.ClientCertificate在IIS 7上返回空

时间:2011-06-15 17:28:22

标签: asp.net iis-7 client-certificates

我正在将一个Web应用程序从IIS 6服务器迁移到IIS 7服务器,我在获取客户端证书时遇到了一些麻烦。

我正在使用的代码片段如下:

        HttpClientCertificate cert = Request.ClientCertificate;

        if (cert.IsPresent)
        {
            ...
        }

在IIS 6服务器上,cert.IsPresent始终为true。但是,在IIS 7框中,它始终为false。两个测试均使用来自同一台计算机的IE 8完成。唯一的变化是服务器URL,因此应该正确设置客户端。

我没有收到任何SSL连接错误(我通过https访问该页面)并且我设置了SSL设置 - >客户端证书:接受(与IIS 6配置相同)。

我已尽可能地将IIS 7服务器配置到IIS 6服务器,但我仍未获得证书。

我还需要查看配置的其他方面吗?

此外,如果我将客户端证书:设置为必需,我在IIS 7框上会出现403.7错误。我不知道这是否是一种症状,但以防信息有用......

3 个答案:

答案 0 :(得分:4)

基本上归结为客户端无法提供客户端证书。 这就是你需要时得到403.7错误的原因。 我相信你需要这个:

http://blogs.msdn.com/b/puneetgupta/archive/2009/08/03/where-is-the-client-certificates-ui-in-iis-7-0.aspx

如果有帮助,请告诉我。

/爸爸

答案 1 :(得分:3)

我在查找有关如何在IIS 7和IIS 6中获取证书的更多信息时遇到了这个问题。我看到@ whosrdaddy的解决方案适用于提问者。我还有其他东西要追捕。

IIS 6和IIS 7之间的区别之一是IIS 6在每个网站的配置中都有“目录安全性”选项卡。为了使IIS 7中的Web服务器请求证书,您必须单击要配置的Web站点或虚拟目录的“SSL设置”功能,以查看“客户端证书:”设置:忽略,接受或要求。

确保未将其设置为“忽略”,否则您将永远无法使用您的证书!

答案 2 :(得分:0)

IsPresent == false可能由几个不同的东西引起,都与服务器和客户端有关。我们在最终解决这些问题的过程中击中了所有人,我将详细介绍每个......

服务器问题#1 - 传入的客户端证书有一个或多个服务器上不存在的证书路径。打开证书转到证书路径(选项卡)并确保每个根权限都在SERVERS受信任的根证书颁发机构中。请注意,您不需要在服务器上仅安装证书(本地计算机)\受信任的根证书颁发机构下的根权限公钥的证书。

服务器问题#2(前面提到的解决方案) - 在IIS中,对于站点,确保将SSL设置设置为Accept或Require(从不忽略)。使用Require的好处是IIS日志会显示403 7错误,其中Accept只会获得IsPresent == false但有200个http代码。

客户问题#1 - 与服务器问题#1相同,必须信任这些权限!

客户问题#2 - 您拥有受信任的root权威,但不是证书本身的私钥。确保将pfx(私钥)安装到证书库而不是公钥(.cer)。您还可以通过双击证书库中的证书来查看您是否拥有私钥,并且在常规选项卡上,您应该看到一条消息说明了这一点。

客户问题#3 - 您将证书放在错误的位置。可能最好将您的证书放在证书(本地计算机)\个人\证书中,而不是(当前用户)。这将使证书可用于处理运行代码并且实际需要访问它的帐户。

客户问题#4 - 右键单击​​证书(在商店中而不是.cer文件) - >所有任务 - >管理私钥......并确保运行代码的流程帐户具有" Read"允许。对此进行快速测试(但不建议用于生产用途)是添加" Everyone"阅读以了解这是否是您的问题。