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

时间:2011-03-13 16:06:14

标签: security authentication x509certificate pki

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

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

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

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

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

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

我错过了什么吗?

3 个答案:

答案 0 :(得分: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颁发新证书以来,序列号会发生变化。

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

答案 1 :(得分:1)

唯一标识用户的最佳方式是通过电子邮件地址。在注册过程中,必须提供有效的电子邮件地址。然后,您将证书序列号和颁发者或证书本身的哈希值与电子邮件和用户ID相关联。然后,当证书过期或用户更改证书时,他/她将具有“续订证书链接”,在该链接中他输入电子邮件地址并且他接收上载新证书的链接。然后,您可以用新的序列号/发行者替换旧的序列号/发行者。

答案 2 :(得分:0)

我决定连接发行者名称,分隔符while和DN。

希望这可以解决使用序列号在续订时更改的问题。

相关问题