X509证书中的序列号是唯一密钥吗?

33
证书序列号是否是X509证书的唯一键? 用户选择了一个证书,然后程序将序列号存储在首选项中。 以下代码会返回所选的证书吗?
public static X509Certificate2 GetCertificateBySerialNumber(string serialNumber)
{
    X509Certificate2 selectedCertificate = null;
    X509Store store = null;
    try
    {
        // get certificate from the store "My", "CurrentUser"
        store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        X509Certificate2Collection allCertificates = (X509Certificate2Collection)store.Certificates;
        X509Certificate2Collection foundCertificates = (X509Certificate2Collection)allCertificates.Find(X509FindType.FindBySerialNumber, serialNumber, false);

        // select the first certificate in collection
        foreach (X509Certificate2 certificate in foundCertificates)
        {
            selectedCertificate = certificate;
            break;
        }
    }
    finally
    {
        if (store != null)
        {
            store.Close();
        }
    }

    return selectedCertificate;
}

更新:如jglouie所建议,最终我使用证书指纹(certificate thumbprint)。

4个回答

21

不行。例如,OpenSSL允许用户在创建证书时设置此项。

请参见:http://www.openssl.org/docs/apps/x509.html

-set_serial n指定要使用的序列号。该选项可与-signkey或-CA选项一起使用。 如果与-CA选项一起使用,则不使用序列号文件(由-CAserial或-CAcreateserial选项指定)。

序列号可以是十进制或十六进制(如果前面加上0x)。也可以指定负的序列号, 但不建议使用它们。


18

TL;DR: 您必须使用发行者名称+序列号的组合键。如果您需要一个简单的键,可以使用证书的指纹。


引用自security.stackexchange的@ThomasPornin:

证书中,序列号由颁发证书的CA选择。它只是写在证书中。CA可以按其认为合适的任何方式选择序列号,不一定是随机的(并且必须适合20个字节)。 CA应该选择唯一的序列号,也就是对于CA来说是唯一的。你不能指望序列号在全球范围内是唯一的;在X.509的梦幻世界中,唯一的是issuerDN + serial这一对(每个CA都有自己独特的可分辨名称,并确保不重复使用序列号)。

Thumbprint是计算完整证书(包括所有字段,包括签名)的哈希值。对于给定的证书,它是全球唯一的,直到所使用的哈希函数的固有碰撞抵抗力。Microsoft软件倾向于使用SHA-1,已知一些理论上的弱点,但尚未产生实际碰撞。

来自:https://security.stackexchange.com/questions/35691/what-is-the-difference-between-serial-number-and-thumbprint


指纹如何在全球各个CA中变得独特?微软表示,指纹并不总是唯一的。https://www.microsoft.com/en-us/research/publication/are-certificate-thumbprints-unique/#:~:text=A%20certificate%20thumbprint%20is%20a,files%2C%20and%20displayed%20in%20interfaces. - kujiy
1
我们还检查了互联网上使用的大量证书的指纹,并没有发现任何证据表明今天使用的证书指纹不是唯一的。 - Dinei

15

正如另一个答案中所提到的,序列号必须在CA内唯一。因此,仅使用序列号作为证书的唯一ID是不行的--来自不同CA的证书可能具有相同的序列号。您需要存储Issuer和SerialNumber属性的组合。另外,对于自签名证书和自制CA软件,数字最可能会发生冲突,因为许多人将从0开始编号。


5
或者他们对序列号的含义一无所知,因此总是将其设置为0 ;) - TomTom
1
我发现了来自同一个CA的不同证书具有相同的序列号。虽然不应该出现这种情况,但确实存在。 - W3t Tr3y
@W3tTr3y 他们的IssuerName是否完全相同?是的,我们也遇到了由CA颁发的证书,其编号配置不正确,但我们看到那里有一个明显的配置问题。 - Eugene Mayevski 'Callback
是的,它们具有相同的颁发者名称。我猜我不理解问题,因为你接下来说,“我们也遇到了由于编号配置不正确而由CA发布的证书”,这意味着你已经看到了这个确切的问题。 - W3t Tr3y
@W3tTr3y 我的意思是我们也遇到了这个问题,但那是在配置CA时操作员的错误。这不是正常的做法,也不符合标准。 - Eugene Mayevski 'Callback

11

根据X.509规范,证书序列号在特定的CA中是唯一的:

4.1.2.2 序列号

序列号是由CA分配给每个证书的整数。它必须对于一个给定的CA颁发的每个证书都是唯一的(即,颁发者名称和序列号可以唯一地标识一个证书)。


14
仅凭序列号无法唯一地识别证书,因为来自不同CA的证书可能具有相同的序列号。 - Eugene Mayevski 'Callback

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