我的系统帐户下的证书存储中存储了一个 X509Certificate,我已使用 Run -> mmc 对其进行了可视化验证。
以下代码成功显示我的证书:
using (var x509Store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
x509Store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificateCollection1 = x509Store.Certificates;
Console.WriteLine($"Listing all available certificates count: {certificateCollection1.Count}");
foreach (var certificate2 in certificateCollection1)
{
Console.WriteLine($"Subject: {certificate2.Subject}");
Console.WriteLine($"Issuer: {certificate2.Issuer}");
Console.WriteLine($"Thumbprint: {certificate2.Thumbprint}");
Console.WriteLine("-------------------------------");
但是,当我使用以下任一方法时:
certificateCollection = x509Store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, certificate2.Subject, true);
或
certificateCollection = x509Store.Certificates.Find(X509FindType.FindBySubjectName, certificate2.GetNameInfo(X509NameType.SimpleName, false), true);
然后当我尝试显示我的证书集合属性时,计数为 0
Console.WriteLine($"Listing all available internal certificates count: {certificateCollection.Count}");
writer.WriteLine($"Listing all available internal certificates count: {certificateCollection.Count}");
我使用相同的主题名称或证书名称来显示证书列表,但它返回 0。这在我的机器上运行良好,但是当相同的代码部署到生产机器时,其中一些无法找到证书。当机器上存在证书并使用相同的名称进行查找时(我确信我没有拼写错误,因为我使用的是 X509Certificate2Collection 返回的相同变量),它会返回一个空集合。
我想了解 x509Store.Certificates.Find 方法做错了什么。
原因之一是 X509Certificate2Collection.Find(X509FindType, Object, Boolean) 方法的最后一个参数
validOnly
设置为 true
。如果您的证书链无效,则方法将不会返回任何内容。尝试将最后一个参数设置为false
,看看结果是否会有差异。