【问题标题】:Find X509 Certificate in a collection where issuer name matches a certain value在颁发者名称与某个值匹配的集合中查找 X509 证书
【发布时间】:2019-02-05 18:37:15
【问题描述】:

在我的应用程序中,我需要能够在本地商店中找到与某个发行者名称匹配的证书。 所以,我之前做的是:

LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common Name", True)

但是由于新的证书服务器已安装并且正在使用活动目录,因此我的证书“颁发者”字段具有附加属性(DC 值)。 完整的字符串如下所示:

"CN=My Common Name, DC=MyCompanyDomain, DC=local"

这不会让我像以前那样使用 Find 方法,并且 CN、DC 值的任何组合都不适合我。

这是我在 ImmediateWindow 中尝试过的:

?LocalStore.Certificates.Item(0).IssuerName
{System.Security.Cryptography.X509Certificates.X500DistinguishedName}
    Name: "CN=My Common Name, DC=MyCompanyDomain, DC=local"
    Oid: {System.Security.Cryptography.Oid}
    RawData: {Length=85}
    m_distinguishedName: "CN=My Common Name, DC=MyCompanyDomain, DC=local"
    m_oid: {System.Security.Cryptography.Oid}
    m_rawData: {Length=85}
?LocalStore.Certificates.Find(X509FindType.FindBySubjectName, "My Common Name", True).Count 
0
?LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common", True).Count 
0
?LocalStore.Certificates.Find(X509FindType.FindByIssuerDistinguishedName, "My Common Name", True).Count 
0
?LocalStore.Certificates.Find(X509FindType.FindByIssuerDistinguishedName, "My", True).Count 
0

【问题讨论】:

  • 您的代码正在寻找 issuer 名称,但您的“完整字符串”可能是基于您在其中使用“My”的主题名称。也许您打算使用X509FindType.FindBySubjectName?如果不是,您确定字符串是Issuer 名称,而不是Subject 名称吗?
  • 证书颁发机构由我控制,因此是“我的”。但是不,我正在尝试按“发行人”进行搜索。我想不出一种方法来禁用 CA 中的 DC 值输出,在旧服务器上,没有 DC 的情况下一切正常

标签: c# iis certificate x509certificate x509certificate2


【解决方案1】:

你可能想要的是FindByIssuerDistingushedName

FindByIssuerName 是一个不区分大小写的子字符串,与发行者名称按正序匹配,带有逗号分隔符,没有字段标记。这作为一个句子没有多大意义,所以让我们举个例子。

正常的 Windows(和 .NET)打印方式实际上是颠倒的,因此您的颁发者可分辨名称很可能是 DC=local, DC=MyCompanyDomain, CN=My Common Name。 FindByIssuerName 会将该值转换为字符串local, MyCompanyDomain, My Common Name,然后如果在该字符串中的任何位置(不区分大小写)找到您的输入,则会匹配。

  • “本地,MyCompanyDomain,我的通用名”:是的
  • “本地,mycompanyDOMAIN,我的通用名”:是的
  • “本地”:是的
  • “m”:是的
  • “”:是的
  • “香蕉”:没有
另一方面,

FindByIssuerDistinguishedName 是一个不区分大小写的 equals,它与 cert.Issuer 返回的字符串相同。所以你已经拥有的字符串将是一个匹配项。

https://github.com/dotnet/corefx/blob/f252ef6d695176143aa46b855db5553fb6e44921/src/System.Security.Cryptography.X509Certificates/tests/FindTests.cs#L381-L406 显示 FindByIssuerName 和 FindByIssuerDistinguishedName 的行为保持单元测试。

【讨论】:

  • 这一切都说得通,但由于某些奇怪的原因,它根本不起作用。我已更新问题以显示调试信息。
  • @AnKing 大概证书已过期、尚未生效或不受您的用户/机器信任。如果您将validOnly: true 更改为validOnly: false,您应该会看到匹配项。
  • 证书刚刚发布并且肯定没有过期,但你是对的,切换到 false 显示它们全部。但是我如何才能确定问题的最终根源呢?
  • @AnKing 使用默认选项为颁发者证书构建 X509Chain,它将解释证书不受信任的所有原因。
猜你喜欢
  • 2021-04-22
  • 2012-03-25
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2013-07-28
  • 2021-11-13
相关资源
最近更新 更多