在我的应用程序中,我需要能够在本地商店中找到与某个发行者名称匹配的证书。 所以,我之前所做的是:
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
答案 0 :(得分:1)
您可能想要的是FindByIssuerDistingushedName
。
FindByIssuerName
是不区分大小写的子字符串匹配项,与发布者名称按正序排列,带有逗号分隔符且没有字段标记。作为句子,这没有什么意义,所以让我们举个例子。
实际的Windows(和.NET)打印方式实际上是相反的,因此您的发卡行可分辨名称很可能是DC=local, DC=MyCompanyDomain, CN=My Common Name
。 FindByIssuerName会将值转换为字符串local, MyCompanyDomain, My Common Name
,然后在该字符串中的任何位置(不区分大小写)找到您的输入时都将匹配。
FindByIssuerDistinguishedName
是不区分大小写的等于等于cert.Issuer返回的字符串的字符串。因此,您已经拥有的字符串将是一个匹配项。
https://github.com/dotnet/corefx/blob/f252ef6d695176143aa46b855db5553fb6e44921/src/System.Security.Cryptography.X509Certificates/tests/FindTests.cs#L381-L406显示了FindByIssuerName和FindByIssuerDistinguishedName的行为保留单元测试。