Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在颁发者名称与特定值匹配的集合中查找X509证书_C#_Iis_Certificate_X509certificate_X509certificate2 - Fatal编程技术网

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

C# 在颁发者名称与特定值匹配的集合中查找X509证书,c#,iis,certificate,x509certificate,x509certificate2,C#,Iis,Certificate,X509certificate,X509certificate2,在我的应用程序中,我需要能够在本地存储中找到与某个颁发者名称匹配的证书。 所以,我以前做的是: LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common Name", True) 但是,由于安装了新的证书服务器并且正在使用active directory,因此我的证书“颁发者”字段具有其他属性(DC值)。 完整字符串如下所示: "CN=My Common Name, DC=MyCompanyDomain, DC

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

LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common Name", True)
但是,由于安装了新的证书服务器并且正在使用active directory,因此我的证书“颁发者”字段具有其他属性(DC值)。 完整字符串如下所示:

"CN=My Common Name, DC=MyCompanyDomain, DC=local"
这将不允许我像以前一样使用Find方法,而且CN、DC值的任何组合对我都不起作用

这是我立即在以下方面尝试的:

?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)打印方式实际上是相反的,因此您的发卡机构可分辨名称很可能是
DC=local,DC=MyCompanyDomain,CN=My Common Name
。FindByIssuerName将该值转换为字符串
local、MyCompanyDomain、My Common Name
,然后如果在该字符串中的任何位置找到您的输入(不区分大小写),则将匹配该值

  • “本地,MyCompanyDomain,我的通用名”:是的
  • “本地,mycompanyDOMAIN,我的通用名”:是的
  • “本地”:是的
  • “m”:是的
  • “”是的
  • “香蕉”:不
另一方面,
FindByIssuerDistinguishedName
,对于证书颁发者返回的相同字符串,是一个不区分大小写的equals。因此,您已经拥有的字符串将是匹配的


显示FindByIssuerName和FindByIssuerDistinguishedName的行为保留单元测试。

您的代码正在查找颁发者名称,但您的“完整字符串”可能是基于您在其中使用“我”的主题名称。也许您想使用
X509FindType.FindBySubjectName
?如果不是,您是否确定字符串是
颁发者
名称,而不是
主体
名称?证书颁发机构由我控制,因此为“我的”。但没有,我正在尝试按“发行人”搜索。我想不出一种方法来禁用CA中的DC值输出,在旧服务器上,没有DC一切正常这一切都很有道理,但由于一些奇怪的原因,就是不起作用。我已更新问题以显示调试信息。@AnKing推测证书已过期、尚未生效或您的用户/计算机不信任该证书。如果您将
validOnly:true
更改为
validOnly:false
,您应该会看到匹配项。证书刚刚颁发,肯定没有过期,但您是正确的,切换到false会显示所有证书。但我如何确定问题的最终来源?@AnKing使用默认选项为颁发者证书构建X509Chain,它将解释证书不受信任的所有原因。