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

时间:2012-02-01 22:10:20

标签: c# x509certificate serial-number

证书序列号是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 所示。

4 个答案:

答案 0 :(得分:14)

没有。例如,OpenSSL让用户在创建证书时设置它。

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

  

-set_serial n指定要使用的序列号。此选项可与-signkey或-CA选项一起使用。如果结合使用   使用-CA选项编写序列号文件(由...指定)    - 未使用-CAserial或-CAcreateserial选项。

     

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

答案 1 :(得分:10)

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

答案 2 :(得分:4)

是的,根据X.509 specification序列号对于特定CA来说是唯一的:

  

4.1.2.2序列号

     

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

答案 3 :(得分:3)

TL; DR :您必须使用发卡行名称+序列号的复合密钥。如果您需要一个简单的密钥,请使用证书的指纹。

从security.stackexchange引用@ThomasPornin:

  

certificate中,序列号由颁发的CA选择   证书。它只是写在证书中。 CA可以   以任何方式选择序列号,不一定   随机(并且它必须适合20个字节)。 CA 假定可供选择   唯一的序列号,即CA 的唯一。你不能指望   序列号在全球范围内独一无二;在X.509的梦想世界中,   它是pair issuerDN + serial,在全球范围内是唯一的(每个CA.   拥有自己独特的专有名称,并注意不要重复使用   序列号)。

     

指纹是在整个证书上计算的哈希值,   其中包括其所有字段,包括签名。那是   世界上独一无二的,对于给定的证书,直至固有的   使用哈希函数的抗冲突性。微软软件   倾向于使用SHA-1,其中已知一些理论上的弱点,   但是还没有产生实际的碰撞。

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