4

我正在开发一个生成 XML 数据并签署生成的 XML 的库。我已将 pkcs12 证书(使用 OpenSSL 从 pem 文件生成)安装到 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 等)。

先感谢您。

4

2 回答 2

4

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

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

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

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

于 2012-05-03T09:53:11.623 回答
4

扩展尤金的答案......

Certificates属性X509Store是一个X509CertificateCollection

您可能会对它的Find方法和X509FindType. 它提供了多种搜索证书的方法。严格来说,主题 DN 和主题替代名称对于识别与证书关联的实体都应该很重要。但是,从演示的角度来看,很少有工具可以做到这一点(例如,这可能会在表格中变得非常混乱)。

正如 GregS 和 Eugene 所指出的,证书指纹(在其他工具中也称为指纹/哈希)将唯一地识别特定证书,而不管其颁发者如何。它可以与X509FindType.

指纹用于 Windows/.Net/SSL 世界的多个地方。特别是,它是选择给定证书安装在 HTTPS 端口上的方法

于 2012-05-03T12:25:08.180 回答