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

问题描述 投票:0回答:1

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

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

但是,由于新证书服务器已安装并且正在使用活动目录,因此我的证书“Issuer”字段具有其他属性(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
c# iis certificate x509certificate x509certificate2
1个回答
1
投票

你可能想要的是FindByIssuerDistingushedName

FindByIssuerName是一个不区分大小写的子字符串,它以正向顺序与发行者名称匹配,并带有逗号分隔符且没有字段标记。这并不像句子那么有意义,所以让我们举一个例子。

正常的Windows(和.NET)打印方式实际上是逆转的,因此您的Issuer Distinguished Name最有可能是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的行为保留单元测试。

© www.soinside.com 2019 - 2024. All rights reserved.