6

我们为 DoD 开发了一个 .NET C# Web 应用程序,它使用 CAC(通用访问卡)作为唯一的身份验证方法。我们在服务器上有一个受信任的 SSL,该应用程序在多个位置运行,并且一切都按预期运行 - 在大多数情况下。

问题 #1

主要问题是,在我们的一些内部开发服务器上,当您在读卡器中使用有效的 CAC 点击“登录”时,只会显示一个证书,而不是来自 CAC。它用于通过网络对我的工作笔记本电脑进行身份验证(“客户端身份验证”和“智能卡登录”属性在“证书”管理单元中进行检查)。

我们在另一个网络上有另一台服务器,客户端证书身份验证运行良好 - 它显示来自 CAC 的证书,但不显示上述证书。我尝试在这两个服务器上并排比较我在 Windows Server 2008 R2 中能想到的所有内容,看看我是否能找到可能不同的东西,但它们似乎都是 Windows Server 2008 的默认安装R2。

以下代码用于读取客户端证书:

if (Request.ClientCertificate.IsPresent)
{
    HttpClientCertificate Cert = HttpContext.Current.Request.ClientCertificate;
    //use cert info to check db and create session
}

此文件位于选中 IIS > SSL 设置 >“需要 SSL”和“需要客户端证书”的目录中。

我不知道这是服务器配置问题还是编码问题,但我已经为此工作了几个月,无法找到为什么应用程序只有在托管在某些服务器上时才能获得 CAC 证书的答案服务器。

问题 #2

如果我在正确读取 CAC 的服务器上访问应用程序,它会从用于访问该计算机上的应用程序的所有 CAC 中提取所有证书的副本,而不仅仅是来自读卡器中物理上的 CAC 的证书.

AKO [https://aklogin.us.army.mil/] 至少过滤掉电子邮件证书;但是,该站点并非托管在 Windows 机器上。

结论

在我看来,除了 Request.ClientCertificate 集合和 IIS 中的两个复选框之外,还必须有一种更好、更深入的机制来访问和过滤来自智能卡读卡器的客户端证书。

4

2 回答 2

6

我有同样的问题。在系统事件日志中查找 SChannel 警告。

“当要求客户端身份验证时,此服务器向客户端发送受信任的证书颁发机构列表。客户端使用此列表选择服务器信任的客户端证书。目前,此服务器信任列表中的许多证书颁发机构“

受信任的根证书颁发机构 > 证书中大约有一百个证书。删除了所有不需要的证书并以管理员身份进行了 IISreset,所有站点都重新开始工作。

于 2013-11-21T15:26:13.463 回答
3

乔,

对于问题 #1,可以尝试以下方法:对照非工作服务器检查工作服务器中的 Trusted Root Cert Authorities 证书。听起来您可能有一个或多个丢失或不匹配的服务器证书。如果您有过期、不匹配或丢失的证书,您可以从 DISA 下载它们。非工作服务器可能不会拉下最新的证书更新。我们曾经有一个案例,商店里的证书太多了。在这种情况下,我们只是删除了旧的和/或不需要的证书。只要确保在删除它们之前导出您计划删除的任何证书......以防万一您以后发现您毕竟需要它们(那将是“经验”说话)!

我希望这会有所帮助,而不仅仅是您已经尝试过的东西。祝你好运!

于 2013-09-19T22:45:34.240 回答