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

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

有帮助吗?

解决方案

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

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

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

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

其他提示

在网络上进行智能卡客户端身份验证有两种方法:标准 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(据我所知可以使用 CAC 卡),您可以将 opensc.conf 中的“transaction_reset”设置为 true,这会导致卡在每次交易(每次 SSL 会话协商)后重置,这样您可以确定,每当您打开新的 SSL 会话时,用户都必须再次输入 PIN。但这是客户端配置,而不是服务器启动的功能。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top