我正在开发一个生成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等)。
提前谢谢。
答案 0 :(得分:3)
是的,CN可能包含相同的标识符(例如,为商业实体颁发证书时)。
证书通常通过以下组合之一进行区分: 1)颁发者名称(不是CN,但是RDN,包含多个字段的完整名称记录)+证书序列号(它在一个CA中是唯一的) 2)颁发者名称+证书哈希
如果在搜索证书之前不知道颁发者名称,则可以向用户显示找到的证书列表,一旦他选择了其中一个证书,就存储证书哈希以供将来参考。
在较小的系统(最终用户的计算机)上,MY商店中的证书数量通常很少,并且哈希冲突的可能性很小。在大型系统上,机会更高,这就是使用Issuer名称的原因。
答案 1 :(得分:3)
扩展Eugene的答案......
Certificates
property of X509Store
是X509CertificateCollection
。
您可能对其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。