Web 服务证书和 Windows 证书存储

问题描述

[寡妇 10 / Windows Server 2016]

一个站点,我们有一个 Web 服务(我们的)调用一个 Web 服务(他们的),在该服务中,他们需要带有请求的证书。 Web 服务正在标准“网络服务”用户下运行应用程序池。 该证书被导入到本地计算机上的个人存储中。 此证书没有私钥,因此删除右键单击 -> 所有任务 -> 管理私钥修复。是的,我意识到这是一个非常奇怪的安排,但它超出了我们的控制范围。

在网络服务中运行,当我们从商店中通过指纹选项查找证书时,它找到了 0 个指纹。没有错误或异常,只有 0 个结果。但是,您可以迭代您从中请求它的存储并将指纹转储到日志中并清楚地看到它存在。

我们也在桌面客户端中以相同的方式使用相同的代码,它发现证书很好。我们的客户端桌面应用程序使用相同的证书调用他们的网络服务。

对于 web 服务版本,我们有一个配置项,当设置时,从用于将其加载到密钥库的文件中加载证书,并且当以这种方式加载时,web 服务对证书没有问题。

当您在证书管理器中查看证书时,它表明它完全有效,没有任何问题。

我们已经尝试在实验室中复制条件,并且设置在这里工作得很好(当然)。

有人对其他要检查的事情有任何想法吗?


附录:

//发现码: //

string thumbprint = LoadThumbprintFromConfig();

LogManager.LogTrace($"Searching for thumbprint [{thumbprint}]");

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

//The immensely complex search query:
X509CertificateCollection col = store.Certificates.Find(X509FindType.FindByThumbprint,thumbprint,true);
X509Certificate2 rval = (col.Count > 0) ? (X509Certificate2)col[0] : null;

//证书考试代码

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

List<string> logEntry = new List<string>();
for (int i=0; i < store.Certificates.Count; i++)
{
   logEntry.Add($"{store.Certificates[i].Thumbprint}");
}

LogManager.LogTrace(string.Join(Environment.NewLine,logEntry));

解决方法

此证书没有私钥,因此删除右键单击 -> 所有任务 -> 管理私钥修复。是的,我意识到这是一个非常奇怪的安排,但它超出了我们的控制范围。

此证书不能用于客户端身份验证。客户端认证只能使用带有私钥的证书。

在网络服务中运行,当我们从商店中通过指纹选项查找证书时,它找到了 0 个指纹。

这意味着您的搜索查询不正确。你的代码在哪里?

对于 web 服务版本,我们有一个配置项,当设置时,从用于将其加载到密钥库的文件中加载证书,并且当以这种方式加载时,web 服务对证书没有问题。

你的代码在哪里?


更新 1:

根据您提供的代码,此调用:

X509CertificateCollection col = store.Certificates.Find(X509FindType.FindByThumbprint,thumbprint,true);

的最后一个参数设置为 true,它只需要有效的证书。看来,您获取的证书无效/不可信。迭代显示所有证书而不管它们的状态,但是 Find 方法有一些额外的逻辑。如果目标证书的 .HasPrivateKey 属性是 false,那么你就倒闭了,在你拿到带有私钥的证书之前你什么也做不了。