28

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

客户端证书必须是由配置的证书颁发机构列表颁发的有效证书,并且在出示时将被检查(验证)。

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

一个相当明显的选择是使用证书指纹。但是指纹本身是不够的,因为可能会发生冲突(即使它们不太可能发生),所以我们需要存储来自证书的附加信息。这个 SO question在这方面也很有帮助。

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

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

我错过了什么?

4

3 回答 3

22

你有几个解决方案:

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

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

最后一点:你想处理证书更新,这是一个好主意,很多软件编辑忘记证书必须更新。但是您必须知道,证书中几乎所有内容都可能发生变化:主题名称(人们可能会改变他们的名字,女人结婚......),颁发者名称(证书供应商公司可能会改变......),密钥算法、密钥大小、扩展名...在您的系统中,证书更新过程可能与初始用户证书注册非常接近。

于 2011-03-13T17:48:47.343 回答
1

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

于 2011-05-18T13:08:53.413 回答
0

我决定将发行者名称、分隔符|和 DN 连接起来。

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

于 2017-07-28T15:50:40.390 回答