在唯一标识用户时使用哪些客户端证书?

mih*_*iha 27 security authentication pki x509certificate

我正在设计一个系统,除了用户名/密码验证之外,用户还可以注册并随后使用客户端证书进行身份验证.

客户端证书必须是由配置的证书颁发机构列表颁发的有效证书,并在出现时进行检查(验证).

在注册阶段,我需要将客户端证书的一部分存储在用户存储库(DB,LDAP,等等)中,以便我可以将使用客户端证书进行身份验证的用户映射到内部"用户".

一个相当明显的选择是使用证书指纹; 但指纹本身是不够的,因为可能会发生冲突(即使它们不可能),因此我们需要存储证书中的其他信息.这个SO问题在这方面也提供了信息.

RFC 2459定义(4.1.2.2)证书序列号在给定CA中必须是唯一的.

综合所有这些,我正在考虑为每个注册用户存储证书序列号和证书颁发者.鉴于客户端证书将被验证并且有效,这应该唯一地标识每个客户端证书.这样,即使续订客户端证书,它仍然有效(序列号保持不变,发行者也是如此).

我错过了什么?

Jcs*_*Jcs 21

你有几个解决方案:

  1. 存储指纹. 是的,你是对的,理论上碰撞是可能的,但概率确实很低,你可以认为它不会发生:系统中的2个用户不会意外地获得相同的证书指纹.然而,哈希算法随着时间的推移越来越弱,攻击者可能会尝试伪造一个指纹与注册证书相匹配的证书.这种攻击被称为第二次原像攻击并且很难做到,因为攻击者不会尝试伪造一些与指纹匹配的随机数据,而是一个真正的X.509证书,它可以通过初始验证阶段(即攻击PKI).非常难:)但是如果你真的想要防止碰撞你可以用2种不同的算法存储2个指纹(例如SHA-1和SHA-256).

  2. 存储证书颁发者和序列号.是的,它可以用作唯一的证书标识符.正如您所写,标准(RFC 5280废弃RFC 2459)表示[The serial number] MUST be unique for each certificate issued by a given CA.但是,这也意味着在更新证书时,自CA颁发新证书以来,序列号会发生变化.

最后一句话:你想要处理证书更新,这是一个好主意,许多软件编辑忘记了证书必须更新.但是你必须要知道证书中几乎所有东西都可能改变:子喷气机名称(人们可能改名,女人结婚......),发行人名称(证书供应商公司可能会改变......),关键算法,密钥大小,扩展名...在您的系统中,证书续订过程可能非常接近初始用户证书注册.