唯一标识用户时要使用客户端证书的哪些部分?

Posted

技术标签:

【中文标题】唯一标识用户时要使用客户端证书的哪些部分?【英文标题】:Which parts of the client certificate to use when uniquely identifying users? 【发布时间】:2011-07-14 12:25:20 【问题描述】:

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

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

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

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

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

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

我错过了什么吗?

【问题讨论】:

【参考方案1】:

您有几种解决方案:

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

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

【讨论】:

我最初的做法是使用序列号+发行人。当我检查我的证书时,我注意到更新后的证书的序列号与其前身相同——但查看 RFC5280,我发现 CA 并非 100% 符合 RFC。序列号的基本原理。正是你提到的:更新。鉴于该序列号。 “必须”更改,指纹也随着证书更新而更改,是否存在未更改且仍提供“给定 CA 内的唯一标识”的属性? 我的错:我正在检查 same 证书的两份副本。序列号。更改,主题也是如此(在我的情况下,它包含一些序列号(不同的))。 RFC (4.1.2.6):“对于由颁发者字段定义的一个 CA 认证的每个主题实体,DN 必须是唯一的。..”这意味着我可以使用主题或序列号与颁发者相结合。不同之处在于 Subject 可以被 CA 内的同一实体重用(从而处理续订)。 我与斯洛文尼亚 CA (Halcom) 的管理员进行了交谈,例如,他们通过更新维护主题字段,除非个人数据发生更改(电子邮件更改、婚姻等)。因此,考虑到所有这些,证书的主题和颁发者字段似乎是最好记住的候选者。 是的,主题名称(或通用名称的一部分)似乎是续订期间不变性的最佳候选者。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于唯一标识用户时要使用客户端证书的哪些部分?的主要内容,如果未能解决你的问题,请参考以下文章

php 如何获取客户端唯一标识?

关于安卓唯一标识的汇总及最佳做法

使用唯一标识符启动多个相同活动实例的重复活动

唯一ID生成算法剖析

唯一ID生成算法剖析

获取移动设备唯一标识