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

C# 序列号是X509证书的唯一密钥吗?,c#,x509certificate,serial-number,C#,X509certificate,Serial Number,证书序列号是X509证书的唯一密钥吗? 用户选择证书,程序在首选项中存储序列号。 以下代码是否将返回所选证书 public static X509Certificate2 GetCertificateBySerialNumber(string serialNumber) { X509Certificate2 selectedCertificate = null; X509Store store = null; try { // get certif

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

更新:我最终使用了Jgluie建议的证书指纹。

否。例如,OpenSSL让用户在创建证书时设置此选项

见:

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

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

是,根据序列号,特定CA的序列号是唯一的:

4.1.2.2序列号

序列号是CA分配给每个用户的整数 证明书它必须是唯一的每个证书颁发的 给定CA(即,发卡机构名称和序列号标识唯一 证书)


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

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


引用security.stackexchange中的@thomasbornin:

在a中,序列号由发布的CA选择 证书。它只是写在证书上的。CA可以 根据需要选择序列号,但不一定 随机(它必须适合20个字节)。CA应该选择 唯一的序列号,即CA的唯一序列号。您不能指望 全世界唯一的序列号;在X.509的梦幻世界里, 它是全球唯一的双发行人N+系列(每个CA 有自己独特的可分辨名称,注意不要重复使用 序列号)

指纹是在完整证书上计算的哈希值, 其中包括其所有字段,包括签名。那是 全球唯一,对于给定的证书,最高可达 所用哈希函数的抗冲突性。微软软件 倾向于使用SHA-1,已知其一些理论缺陷, 但还没有发生实际的碰撞


From:

序列号本身不能唯一标识证书,因为来自不同CA的证书可以具有相同的序列号。+1。或者不知道序列号应该是什么,所以他们一直设置为0;)我会说我从同一CA中找到了具有相同序列号的不同证书。不应该发生,但确实发生了。@W3tTr3y它们是否共享相同的发行者名称?是的,我们还发现CAs颁发的证书编号配置不正确,但我们看到了一个明显的配置问题。是的,它们是相同的颁发者名称。我想我不明白这个问题,因为您继续说“我们还遇到了CAs颁发的证书,其编号配置不正确”,这意味着您已经看到了这个问题。@W3tTr3y我是说我们也遇到了这个问题,但这是配置CA时的操作员错误。这不是正常做法,也不是标准所允许的。