我很难理解证书的序列号与其SHA1哈希之间的区别。

MSDN表示:


序列号一个唯一标识证书的数字,并且
由证书颁发机构颁发。


那么我可以通过证书的序列号来识别它吗?

Wikipedia表示哈希值:


指纹:哈希值本身,用作公共密钥证书的缩写形式。
>

因此哈希标识(例如RSA)密钥。

我目前对Android应用程序证书进行了一些研究,发现了一些有趣的证书:

[Issuer][Serial][SHA1 Hash][Valid From]
[C=US, L=Mountain View, S=California, O=Android, OU=Android, CN=Android, E=android@android.com][00936EACBE07F201DF][BB84DE3EC423DDDE90C08AB3C5A828692089493C][Sun, 29 Feb 2008 01:33:46 GMT]
[C=US, L=Mountain View, S=California, O=Android, OU=Android, CN=Android, E=android@android.com][00936EACBE07F201DF][6B44B6CC0B66A28AE444DA37E3DFC1E70A462EFA][Sun, 29 Feb 2008 01:33:46 GMT]
[C=US, L=Mountain View, S=California, O=Android, OU=Android, CN=Android, E=android@android.com][00936EACBE07F201DF][0B4BE1DB3AB39C9C3E861AEC1348110062D3BC1B][Sun, 29 


还有很多共享相同序列号,但是具有不同哈希值的东西。

那么可以有一个具有不同密钥的证书吗?为Android应用程序创建证书时,实际上是谁在创建序列号?对于哈希来说,很明显,但是我可以创建与另一个证书具有相同序列号的新证书吗?

我可以确定由同一人创建具有相同序列号的证书吗?

#1 楼

在证书中,序列号由颁发证书的CA选择。它只是写在证书中。 CA可以选择它认为合适的任何方式的序列号,而不必选择随机的序列号(必须容纳20个字节)。 CA应该选择唯一的序列号,也就是CA唯一的序列号。您不能指望全球唯一的序列号;在X.509的梦想世界中,它是在全球范围内都是唯一的对发行人DN + serial(每个CA都有自己独特的专有名称,请注意不要重复使用序列号)。

指纹是在完整证书上计算的哈希值,该证书包括其所有字段,包括签名。对于给定的证书,该证书在全球范围内是唯一的,不超过所使用的哈希函数固有的抗碰撞性。 Microsoft软件倾向于使用SHA-1,因为SHA-1具有一些理论上的弱点,但是尚未产生实际的冲突(尚未)。 CWI和Google的研究人员现已证明了对SHA-1的碰撞攻击。

(您显示的指纹似乎由40个十六进制字符(即160位)组成,再次指向SHA-1作为合理使用的哈希函数。)

评论


您知道指纹的最大长度由任何标准确定吗? 40个字符足以分配到数据库列中吗?

– Michael Freidgeim
13年6月21日在22:38

@MichaelFreidgeim最大长度取决于哈希算法。每个哈希具有不同的长度输出。在此处查看表中的输出大小。请记住,如果您对哈希输出进行文本编码,则必须在数据库字段中容纳编码开销。

– tylerl
13年6月22日在7:31

当您说指纹包含完整的证书时,该证书也包含序列号吗?还是只是公钥部分?

– Brain2000
13-10-24在20:23



@cottsak两个证书(具有不同的指纹)可以具有相同的公钥。例如:相同的密钥由两个不同的(中间)CA签名。

–大卫·巴拉西奇(DavidBalažic)
16年8月4日在15:35

好了,现在有SHA-1冲突:shattered.io(来自StackOverflow的@foo的提示)

–迪尼
17 Mar 30 '17:14



#2 楼

指纹是二进制.DER格式的证书的sha1sum或sha256sum。也就是说,从Unix终端运行:

sha1sum /path/to/mycertificate.der


该命令的六进制输出就是您的指纹。也称为指纹。试试看,您会看到的。