【问题标题】:Clearly recognize a certificate in Windows certificate store清楚地识别 Windows 证书存储中的证书
【发布时间】:2012-05-12 19:35:34
【问题描述】:

我正在开发一个生成 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 等)。

提前谢谢你。

【问题讨论】:

    标签: c# windows ssl cryptography x509certificate


    【解决方案1】:

    扩展尤金的答案...

    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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 谢谢,IssuerName + cert 序列号正是我要找的。 IETF 说:序列号必须是 CA 分配给每个证书的正整数。对于给定 CA 颁发的每个证书,它必须是唯一的(即,颁发者名称和序列号标识唯一证书)。 CA 必须强制 serialNumber 为非负整数。但是,RDN 是什么意思?
      • 我认为 RDN 是 X500DistinguishedName 类型的 Issuername
      • @csteinmueller RDN 代表 RelativeDistinguishedName。这是类型 -- 具有多个字段的结构。注意:序列号是一个整数,但是这个整数的长度没有定义,20字节长的序列号并不少见。
      • 不要忘记指纹。这是识别证书的最简单方法。
      • 整个证书的 SHA-1 摘要发生冲突的可能性应该与 tbsCertificate 部分的摘要发生冲突的可能性非常相似。如果发生这种情况(在 tbsCertificate 上),则意味着可以更改证书并保持相同的签名。这将是一件大事,而且这不太可能,当然也不太可能有两个具有相同 DN 的证书。
      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 2011-11-09
      • 2018-05-10
      • 2011-12-16
      • 2016-03-13
      • 2010-09-23
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多