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

时间:2018-08-30 18:37:43

标签: c# iis certificate x509certificate x509certificate2

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

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

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

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

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

这是我在InstantWindow中尝试过的:

?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

1 个答案:

答案 0 :(得分:1)

您可能想要的是FindByIssuerDistingushedName

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

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

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

FindByIssuerDistinguishedName是不区分大小写的等于等于cert.Issuer返回的字符串的字符串。因此,您已经拥有的字符串将是一个匹配项。

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