31

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

4 回答 4

21

不可以。例如,OpenSSL 让用户在创建证书时进行设置。

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

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

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

于 2012-02-01T22:12:57.857 回答
14

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


引用 security.stackexchange 中的@ThomasPornin:

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

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

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

于 2015-10-08T11:57:54.070 回答
13

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

于 2012-08-03T19:15:03.883 回答
10

是的,根据X.509 规范,序列号对于特定 CA 是唯一的:

4.1.2.2 序列号

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

于 2012-03-18T21:48:16.950 回答