CAC 智能卡重新认证

Posted

技术标签:

【中文标题】CAC 智能卡重新认证【英文标题】:CAC Smartcard Reauthenticate 【发布时间】:2010-12-20 12:30:07 【问题描述】:

我们有一个基于浏览器的应用程序,我们想让用户在输入时重新进行身份验证。因此,当他们访问该 URL 时,我们希望向他们显示 PIN 提示,以便他们必须重新进行身份验证。有没有合理的方法来做到这一点?

添加信息:这是针对 CAC 卡的,工作站上有 ActivIdentity 和 Tumbleweed。此外,如有必要,我可以向工作站添加服务。浏览器都是IE7。 Web 服务器是 IIS 6,页面是用 ASP.NET(大部分)编写的。

【问题讨论】:

请分享这个问题是如何解决的。 :) @Kevin 我向客户解释说 CAC 卡上的 pin 超时完全独立于浏览器,从而推翻了这个要求。从安全的角度来看,尝试干扰正常运行并不是一个好主意。他们的安全人员同意不必每次都让客户重新输入密码;更好的方法是仅在过期后重新进入。 【参考方案1】:

这里涉及到几个不同的软件。

首先是卡片本身。要执行数字签名,CAC 必须处于“已验证”状态,这意味着在插入卡后输入了 PIN。除此之外,卡上的每个钥匙都有一个标志,指示每次使用钥匙时是否必须输入 PIN。我还没有检查,但我认为这是为 CAC 上的“电子邮件”密钥对设置的。因此,您需要找到哪些密钥设置了“始终验证”标志,并将服务上的路径验证器配置为仅接受这些密钥。您可能需要在扩展密钥使用中使用特定的 OID,或者从路径构建中排除一些 DoD 中间证书(也许将它们标记为已撤销)。

与卡通信的机器上的中间件也可以缓存 PIN,并在卡指示它在完成操作之前需要 PIN 时将其提供给卡。我认为 ActivClient 在版本 6 中使用其 PIN 缓存功能执行此操作,但在版本 7 中,此选项似乎已丢失。我在 Windows 内置的 PIV 支持中没有找到类似的东西。这个“功能”可能会危及安全,所以我的猜测是它是被故意删除的,不会有任何注册表黑客或其他方式来恢复行为。这是您无法控制的,除非您管理用户的机器;没有可用于强制输入 PIN 的 HTTP 标头或 TLS 选项。但是,对于较新的系统,这应该不是问题。

在服务器端,必须进行完整的握手才能使客户端执行身份验证。如果存在有效的 TLS 会话,则不会发生客户端身份验证。因此,在请求身份验证之前,您需要找到一种方法使 TLS 会话(不是应用程序会话,它可能与 HTTP cookie 相关联)无效,或者将身份验证请求定向到另一个没有启用会话的接口。

【讨论】:

谢谢 sylvarking,我想我明白你在说什么了。我对服务器和工作站(几百个)都有很多控制权,所以也许我可以在浏览器中做一些事情,导致智能卡需要 PIN? 没错。如果您管理工作站,您可能能够将所有读卡器软件配置为更频繁地提示输入 PIN。例如,我使用 ActivClient 作为读卡器软件。它实际上是弹出对话框以询问 PIN 码,并且有一个设置可以控制用户需要多久重新输入一次。 我很幸运能找到具有 ActivIdentity Experience 的人。您的回复促使我查看以前从未见过的 PIN 缓存服务。我可以看到 12 个属性,其中一个称为“启用 PIN 缓存”。我将尝试将其关闭。 PIN 缓存服务是 ActivClient 配置管理器中的一个属性。 不要混淆条款——它是“卡片软件”而不是“读卡器软件”。通过更改 PIN 缓存设置,您无法击败 SSL 在浏览器中的工作方式。如果您需要自定义身份验证流程,可以查看 OpenID 和 trustbearer.com openid 服务。如果我没记错的话,他们实现了基于插件的身份验证,其中有一个与卡对话的自定义插件。可能会为每笔交易触发一个 PIN 对话框(因为它使用隐式签名操作?不知道细节..)。【参考方案2】:

在网络上进行智能卡客户端身份验证有两种方法:标准 TLS/SSL 或浏览器的自定义插件。我假设您说的是标准网络浏览器(IE/FF/Safari)和 SSL 身份验证。

对于 PIN 提示,有两件事很重要:

SSL 会话和 SSL 会话缓存 浏览器 相关私钥的卡上认证状态 中间件的实现方式。

最后,从安全的角度来看,是卡知道何时“要求”一个 PIN - 一些卡和密钥需要一个 PIN 用于每次使用密钥的操作,有些卡可以获取一次 PIN 并且将密钥保持在经过身份验证的状态,直到它从读取器中移除或被应用程序重置。

如果浏览器缓存中的会话无法重用或正在建立连接时,智能卡中间件(Linux 上的 PKCS#11、Windows 上的 CryptoAPI/BaseCSP 模块或 OSX 上的 Tokend)需要进行对话到卡上的钥匙。如果卡上的认证状态需要输入 PIN 码,通常由浏览器触发回调。或者,如果中间件知道它需要 PIN,它会在与卡对话之前询问它。

输入 PIN 与实际重新验证对私钥的访问权限和重新验证 SSL 会话之间没有 1:1 的关系。

使用标准 SSL,您依赖于 SSL 在浏览器中的实现方式,并且无法在客户端实现 100% 可靠的“通过输入 PIN 进行重新身份验证”。

如果您使用的是 Linux,那么使用 OpenSC(AFAIK 可以使用 CAC 卡),您可以将 opensc.conf 中的“transaction_reset”设置为 true,这会导致在每次交易后重置卡(每次 SSL 会话协商)这样您就可以确保无论何时打开新的 SSL 会话,用户都必须再次输入 PIN。这是客户端配置,而不是服务器启动的功能。

【讨论】:

感谢马丁的精彩评论。我看到我应该提供更多信息,但我仍然非常不知道在这种情况下什么是有意义的。工作站确实有称为 ActivIdentity 或 ActivClient 的中间件。该进程名为 accoca.exe。他们也在经营 Tumbleweed。 另外,我从您的评论中得知,我的挑战是以某种方式说服卡它需要再次要求输入 PIN。我还没有弄清楚中间件是如何工作的,但是说当用户访问一个 URL 时,我可以在网页中放置一些东西,这会导致 CAC 决定它需要请求一个 PIN,这是否合理?也许我可以终止 SSL 会话? (对不起,如果这是愚蠢的想法,我有点困惑)。 当我清除 SSL 状态时(使用 IE7-工具-Internet 选项-内容-清除 SSL 状态,它会提示我输入证书而不是 PIN。如果我选​​择正确的证书,它可以工作,如果我选择了错误的证书,它失败了。那么,如果它不提示输入 PIN,为什么它会再次提示我输入证书?我不明白! 清除浏览器 SSL 缓存会删除会话。所以中间件可能没有实现任何特殊的 PIN 技巧,并且完全按照我描述的方式工作 - 一旦卡处于身份验证状态,只要应用程序没有重新启动或卡被移除,就可以使用密钥。它要求证书知道您要使用哪个私钥,如果您选择智能卡,它可以使用它来建立新会话,因为卡上的密钥已经处于经过身份验证的状态。 啊,我明白了。它要求证书,因为您可以同时使用不同的密钥做不同的事情。我早该想到的!您可能已经看到我的另一个问题,我发现退出 IE7 总是会在 IE7 下次启动时导致 PIN 提示。这让我相信 IE7 在退出时会“重置”卡状态。如果我能弄清楚那是什么,我会离我需要的更近一步(我认为)。【参考方案3】:

您可以使用javascript函数使浏览器忘记少数浏览器上现有的SSL缓存:

function logout() 
    // clear browser authentication cache
    // IE specific
    try
    
        document.execCommand("ClearAuthenticationCache", "false");
    
    catch(e)
    
        // do nothing
    

    // clear for firefox or any browser that supports window.crypto API
    if (window.crypto && typeof window.crypto.logout === "function") 
        window.crypto.logout();
    

您可以使用Javascript setTimeout 方法调用上述注销函数,并可能将它们重定向到logout.aspx 页面以强制客户端输入新的PIN。

但它使用 JavaScript,代码依赖于浏览器,并不适用于所有浏览器。

【讨论】:

以上是关于CAC 智能卡重新认证的主要内容,如果未能解决你的问题,请参考以下文章

使用智能卡证书和公钥的网站认证

使用智能卡身份验证进行自动化测试(硒或其他选项?)

如何在智能卡读卡器中实现被动认证?

针对基于智能卡进行认证的活动目录攻击

Microsoft Windows 智能卡认证缓冲区溢出漏洞 (CVE-2017-0176)

安全基础-C