在颁发者名称与特定值匹配的集合中查找 X509 证书

AnK*_*ing 2 c# iis certificate x509certificate2 x509certificate

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

LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common Name", True)
Run Code Online (Sandbox Code Playgroud)

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

"CN=My Common Name, DC=MyCompanyDomain, DC=local"
Run Code Online (Sandbox Code Playgroud)

这不会让我像以前一样使用 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
Run Code Online (Sandbox Code Playgroud)

bar*_*njs 6

你可能想要的是FindByIssuerDistingushedName.

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

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

  • “本地,MyCompanyDomain,我的通用名称”:是的
  • “本地,mycompanyDOMAIN,我的通用名称”:是的
  • “本地”:是的
  • “米”:是的
  • “ “: 是的
  • “香蕉”:不

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

https://github.com/dotnet/corefx/blob/f252ef6d695176143aa46b855db5553fb6e44921/src/System.Security.Cryptography.X509Certificates/tests/FindTests.cs#L381-L406显示了 FindservingIsuerName-FindServingIsuerName 的测试行为。