清楚地识别Windows证书库中的证书

时间:2012-05-03 09:40:14

标签: c# windows ssl cryptography x509certificate

我正在开发一个生成XML数据并指示生成的XML的库。我已经安装了一个pkcs12证书(使用pem文件中的OpenSSL生成)到Windows证书库中。

我正在使用

从C#代码加载证书
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = null;

foreach (var item in store.Certificates)
{
    if (item.SubjectName.Name.Contains("CN=IDENTIFIER"))
    {
        cert = item;
        break;
    }
}
store.Close();

在我的情况下,CN标识符是:我的名字+姓氏。证书来自第三方。所以我认为我对标识符没有影响。

这就是问题所在:

有没有办法从C#中准确识别此证书。将来有可能,多个证书具有相同的X509参数(CN等)。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

是的,CN可能包含相同的标识符(例如,为商业实体颁发证书时)。

证书通常通过以下组合之一进行区分: 1)颁发者名称(不是CN,但是RDN,包含多个字段的完整名称记录)+证书序列号(它在一个CA中是唯一的) 2)颁发者名称+证书哈希

如果在搜索证书之前不知道颁发者名称,则可以向用户显示找到的证书列表,一旦他选择了其中一个证书,就存储证书哈希以供将来参考。

在较小的系统(最终用户的计算机)上,MY商店中的证书数量通常很少,并且哈希冲突的可能性很小。在大型系统上,机会更高,这就是使用Issuer名称的原因。

答案 1 :(得分:3)

扩展Eugene的答案......

Certificates property of X509StoreX509CertificateCollection

您可能对其Find method and the X509FindType感兴趣。它提供了许多搜索证书的方法。严格来说,the subject DN and the subject alternative names对于识别与证书关联的实体非常重要。但是,从演示的角度来看,很少有工具可以做到这一点(例如,这可能会在表格中变得非常混乱)。

正如GregS和Eugene指出的那样,certificate thumbprint (also known as fingerprint/hash in other tools)将唯一地识别特定证书,而不管其发行者。它can be used with X509FindType

指纹用于Windows / .Net / SSL世界中的多个位置。特别是it's the way to pick a given certificate to install on an HTTPS port