序列号和指纹有什​​么区别?

信息安全 证书 安卓 x.509
2021-08-22 04:56:00

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

MSDN 说:

序列号 唯一标识证书的编号,由证书颁发机构颁发。

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

维基百科说哈希:

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

因此,哈希标识(例如 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 应用程序创建证书时,实际上是谁在创建序列号?对于哈希很清楚,但是我可以创建一个与另一个证书具有相同序列号的新证书吗?

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

2个回答

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

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

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

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

sha1sum /path/to/mycertificate.der

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