在我的应用程序中,我需要能够在本地商店中找到与特定颁发者名称匹配的证书。 所以,我之前做的是:
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/