X509Store 无法按主题名称找到证书

问题描述 投票:0回答:1

突然(客户报告服务“一段时间”失败),我再也找不到证书了。

该证书位于给定商店中所有证书的列表中,但无法通过其主题名称(部分)找到(例如,应用程序使用可配置的主题名称):

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);

// it's in the list...
var subject = store.Certificates[0].Subject;
Console.WriteLine(subject); // CN=CertName, OU=...
var subName = subject.Substring(3, 6);
Console.WriteLine(subName); // CertNa

// ...but can't be found
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, subName, false);
Console.WriteLine(certs.Count); // 0

(有效)证书是该商店中唯一的证书。此外,检查私钥 ACL 等也没有发现可疑值。由于我可以列出证书,我也应该能够找到它。不?为什么不呢?

c# .net x509certificate windows-server
1个回答
0
投票

这比回答问题更像是“心理调试”,但我猜测匹配字符串正在交叉属性。

// it's in the list...
var subject = store.Certificates[0].Subject;
Console.WriteLine(subject); // CN=CertName, OU=...
var subName = subject.Substring(3, 6);
Console.WriteLine(subName); // CertNa

我的猜测是你从未见过这样的失败。但他们可能会搜索

CN=CertNa
。这(基本上)永远不会在
FindBySubjectName
上匹配,因为它不使用与
cert.Subject
相同的字符串表示形式。

https://github.com/dotnet/runtime/blob/40bc2d88b6606324f5774cc972d480a1d26084f8/src/libraries/System.Security.Cryptography/tests/X509Certificates/FindTests.cs#L327-L370显示什么匹配/不匹配练习,但基本上,如果您认为某个主题是

CN=Common Name, OU=Organizational Unit, O=Organization, L=Locality, S=State, C=Country
,那么
FindBySubjectName
就是
"Country, State, Locality, Organization, Organizational Unit, Common Name".ContainsIgnoreCase(input)
。也就是说,它与您期望的顺序相反(有趣的是,它本身称为“反转”),并且它不包含属性标签和等号。

由于 .NET 测试在 .NET Core/.NET 5+ 的历史上没有改变,所以 .NET 和 Windows 都没有改变匹配逻辑。因此,如果它正在工作,然后停止了,那么实际的问题可能是证书已更新并且在测试的(不明显)字符串下不再匹配。

(更改为指责视图表明这些测试自 2015 年 10 月 5 日以来没有改变,当时在非 Windows 系统上添加了 FindBySubject 支持)

© www.soinside.com 2019 - 2024. All rights reserved.