CAC智能卡重新认证

adg*_*adg 9 security authentication smartcard cac

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

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

eri*_*son 11

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

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

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

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


Mar*_*jak 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.这是客户端配置,而不是服务器启动的功能.