关于X.509证书的序列号,RFC 5280表示:序列号必须是CA为每个证书分配的正整数。对于给定CA颁发的每个证书,它必须是唯一的(即,颁发者的名称和序列号标识唯一的证书)。 CA必须将serialNumber强制为非负整数。


没有提及序列号生成的安全性问题。有哪些好的做法?可预测的(例如顺序的或基于证书生成日期的)序列号是否存在任何安全问题?

评论

OpenWISP模块之一具有django-app可重用应用程序,该应用程序可实现基于uuid4整数的具有随机序列号的x509证书。该代码是开放源代码(BSD):github.com/openwisp/django-x509(该实现受到此问题中的讨论的启发)

#1 楼

非随机序列号本身并不表示签名方案存在安全性问题,但是,正如@Jack指出的那样,它可以用于利用攻击。通常,签名算法首先使用给定的哈希函数对输入消息进行哈希处理。如果消息或哈希过程完全由攻击者控制,则哈希函数的抗冲突性将成为重要问题。另一方面,签名人插入了一些随机性(例如,随机序列号,由证书的发行CA添加),签名应该能够抵抗纯粹的碰撞攻击,并且最终可以抵抗原像(和MD5尽管有其所有缺点,但似乎仍然具有最佳的抗原像能力。 Halevi和Krawczyk已指定一种通用方法,该方法应适用于所有哈希函数,并将其称为RMX。它产生了Internet草案和NIST特别出版物SP-800-106。值得注意的是:


RMX旨在应用于任何二进制消息,但它需要生成一些随机值,以与消息一起传输。
哈希处理被修改,签名者和验证者必须在消息处理开始时就意识到RMX。
RMX包含有关如何从DSA / ECDSA签名的前半部分提取随机值的说明( “ $ r $”值,它不取决于签名的消息。这是为了节省带宽并与现有的数据格式兼容(它们没有多余的“随机值”的余地),但是这会使签名更加复杂,因为在散列密码之前必须先生成“ $ r $”值。输入消息-在外部化哈希的系统中,在另一个模块中,而不是持有签名私钥的模块中,这可能会很麻烦。
这是一项尚未在任何显着标准中找到的建议。

使用随机序列号是“穷人的随机哈希”,它具有与现有X完全兼容的优良特性。 509个证书验证者(哈希过程和证书格式没有任何改变),尽管不是为了防止冲突攻击,许多CA已经实现了它。在证书中,序列号在结构中“足够早”出现,它与公钥之间有一些大的固定元素(即,主题和颁发者名称,有效日期...),因此足以满足现有的MD基于哈希的函数(MD5,SHA-1 ...),以防止冲突攻击的利用。同样,足够长的随机序列号可以确保以极大的概率实现唯一性,而不必在数据库中查找任何内容。为了实现适当的互操作性,请使用小于$ 2 ^ {159} $的正序号(这样可确保ASN.1 DER中指定的值编码适合20个字节)。

完全不相关对于冲突和签名,但与安全性相关,可预测的序列号会泄露业务信息。正如彼得·古特曼(Peter Gutmann)在其《 X.509样式指南》(一个古老但有趣且并不完全过时的文本)中指出的那样:


通过使用序号,CA最终揭示出它的证书数量实际签名(每周需要花费证书的费用,比赛可以准确查明每周颁发多少证书)


评论


$ \ begingroup $
如果使用随机序列号,那么序列号的合适长度是多少?通常,整数是32位,但是在X.509 / ASN.1的情况下,天空是极限。哎呀-您具有用于2048位“整数”的RSA密钥的整数类型。
$ \ endgroup $
– Neubert
15年7月16日在6:21

$ \ begingroup $
整数是整数-它们是无界的,否则我们称它们为模块化整数。碰巧,现代计算机最适合以32或64位为模的整数(即“ 32位或64位整数”),但它们仍然可以处理较大的整数,就像对RSA一样。为了向后兼容,X.509(RFC 5280)表示序列号应为正,并且其编码值应为20个字节,这意味着您需要使用159位(序列号应介于0到2 ^ 159之间) -1(含)。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
15年7月16日在12:27

$ \ begingroup $
序列号不是公共数据/在证书中可见吗?如果知道随机值,是否可以提高安全性?
$ \ endgroup $
– yurtesen
20-2-29在19:44



$ \ begingroup $
@yurtesen随机序列号的重点是,在获得证书之前,申请证书的人员不知道该序列号。此后,序列号是公开的(因为它在证书中),但是此时签名是由CA生成的,对于攻击者而言,要创建自定义名称+密钥以对哈希函数进行碰撞攻击为时已晚。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
20-2-29在20:25

$ \ begingroup $
@ThomasPornin对于攻击者而言为时已晚,因为“有效自”和“有效至”字段将具有不同的值,因此生成的哈希值更难于相同吗?还是出于其他原因?
$ \ endgroup $
–用户名
20-11-26在15:31

#2 楼

使用可预测的序列号(以及MD5中的严重缺陷)在2008年创建了流氓CA证书。对序列号进行随机化可以防止此攻击。
并且,显然,使用序列号可以揭示已签名证书的数量,并且需要仔细的状态管理。

通常,我会说使用大的(足够大以至于不可能发生冲突,比如说128或160位)随机数是当前的最佳做法,否则该证书对于攻击者而言是已知的或可预测的,这可能像MD5攻击那样更容易利用原语中的弱点(哈希或签名机制)。