CAC智能卡重新认证

时间:2009-11-25 23:47:40

标签: security authentication smartcard cac

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

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

3 个答案:

答案 0 :(得分:11)

这里涉及一些不同的软件。

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

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

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

答案 1 :(得分:7)

在Web上进行智能卡客户端身份验证有两种方法:标准TLS / SSL或浏览器的自定义插件。我假设您正在谈论标准Web浏览器(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。这是客户端配置,而不是服务器启动的功能。

答案 2 :(得分:0)

您可以使用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,代码依赖于浏览器,并不适用于所有浏览器。