一个X.509证书的序列号

5

我正在为大学课程编写一个Java证书颁发机构,现在我不知道证书序列号的最佳选项是什么。

  • 简单的静态计数器从0到非常大的数字
  • 一些巨大的BigInt随机数

选择其中一个有没有任何好的理由...或者都不选?

谢谢!

6个回答

2

从技术上讲,从0计数到非常大的数字比生成一个大的随机数容易实现 - 因为序列号必须不同。

然而,如果你关心人们知道你发行了多少个证书,就不应该使用简单的计数器。


2

这取决于您使用序列号的目的。如果您是一家小公司,并且计划为每个客户提供一个证书,那么您的序列号将显示您有多少客户。

除此之外,我不认为序列号不应该是连续的有任何理由。有些人认为使用序列号会向潜在攻击者透露一些信息(下一个序列号),但我认为这不是一个大问题。


2
我建议您使用随机数,但在数据库中保留已发行序列号的列表。这将允许两件事情。
1. 您永远不会重新发行相同的序列号。 2. 您可以从证书的序列号中判断其是否有效。
当然,第一点要求您在生成时检查已知列表,并在发生冲突时生成新的随机数,而第二点在安全或验证方面并没有太多意义,但仍是一个有趣的前景。

4
“你可以从序列号中大概判断出证书是否有效”这种说法是不正确的。要确定证书是否有效,需要进行多项检查,其中序列号并非其中之一。它可能只是一个您已存储的证书列表中的快速索引,但仅此而已。哈希值同样适用。但它肯定不能帮助客户验证证书是否有效(或“大概”有效,无论“大概”意味着什么)。 - John
@John,我猜你没有看到我的另一句话……“#2在安全性或验证方面并不算什么,但仍然是一个有趣的前景。” - Jason Whitehorn
2
我已经阅读并同意。但是,你推荐一个随机数后,描述的好处与数字的随机性实际上没有关系,它们同样适用于使用序列号。在安全协议中,当从零开始的序列足够时,传统上使用术语“序列号”,而当使用随机数可以获得安全保障时,则使用术语“nonce”。我发现很多人(尤其是学生)很容易对PKI产生错误的印象,因此值得在任何机会澄清。谢谢。 - John
这里提到了使用随机数的好处: https://security.stackexchange.com/a/15700/72959 - garnet

2
主要要求是配对的(发行者区分名称,序列号)在整个宇宙中应该是唯一的。因此,除非随机数非常大以至于重复的概率可以忽略不计,否则不应使用随机数。20字节的随机数应该足够了。如果您不介意其他人知道您发行了多少证书,那么简单的计数器就可以完全胜任。
最近针对SSL证书颁发机构(由Alex Sotirov等人)的攻击实际上更容易利用MD5中的弱点,这是使用计数器类型序列号造成的。没有攻击随机序列号。这并不意味着可预测的序列号是不安全的,只是意味着对于这种应用程序,随机序列号可以帮助掩盖MD5的弱点。根本问题仍然是MD5。

0

我认为如果我们仔细研究“串行”这个词,答案就会隐含在其中……串行、系列、进展等等。


0

我刚好偶然间遇到了这个问题,从答案中可以看出可预测的序列号并不是一个安全问题。但我认为它确实是一个问题,随机序列号更安全。例如,可以参考Flame攻击等这里,或者这里,或者维基百科关于“可预测序列号攻击”的文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接