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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在发行人名称与特定值匹配的集合中查找X509证书相关的知识,希望对你有一定的参考价值。

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

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
答案

你可能想要的是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的行为保留单元测试。

以上是关于在发行人名称与特定值匹配的集合中查找X509证书的主要内容,如果未能解决你的问题,请参考以下文章

Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )(代

如何验证 x509 证书的签名?

X509Store 证书问题。查找 FindByThumbprint

x509的简介

CA签名X509证书包含X509v3扩展名“主题备用名称”两次

x509的详细特征