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

标签 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 值的任何组合对我都不起作用。

这是我在 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,然后如果您的输入(不区分大小写)位于该字符串的任何位置,则匹配。

  • “local, MyCompanyDomain, My Common Name”:是的
  • “local, mycompanyDOMAIN, My common name”:是的
  • “本地”:是的
  • “m”:是的
  • "":是的
  • “香蕉”:没有
另一方面,

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

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

关于c# - 在颁发者名称与特定值匹配的集合中查找 X509 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52103417/

相关文章:

c# - 有没有办法将个人证书、中间根和可信根封装在一个可移植文件中?

c# - 连接到网络上的 Excel 工作表(数据库)

c# - 为什么仅在调试时才引发跨线程异常?

c# - 尝试在 C# 中使用 ODBC 调用 Oracle 包时出现语法错误

iis - 带有 IIS URL 重写模块 2.0 的 Server.MapPath()

iis - 一般来说,如何扩展 IIS 并添加自定义控制面板图标?

iis - IIS应用程序池内存使用过多

c# - 如何从 Azure 函数中获取多个 blob?

java - 如何使用基于证书的身份验证创建Azure blob并使用java从中下载文件

c# - SSL证书生成