当 WCF 应用程序在 Windows 7 上作为 Windows 服务托管时,找不到证书

Posted

技术标签:

【中文标题】当 WCF 应用程序在 Windows 7 上作为 Windows 服务托管时,找不到证书【英文标题】:Certificate is not found when WCF Application is hosted as a Windows Service on Windows 7 【发布时间】:2019-04-12 05:22:47 【问题描述】:

我们有一个 WCF 应用程序,它可以作为 Windows 服务或控制台应用程序托管。

此应用程序使用智能卡证书来验证对第三方应用程序的某些请求。我们使用以下逻辑从 Windows 证书存储中获取证书:

public X509Certificate2 GetCertificate(string certificateName)

    var store = new X509Store(StoreLocation.CurrentUser);

    store.Open(OpenFlags.ReadOnly);

    X509Certificate2Collection sel = store.Certificates.Find(X509FindType.FindBySubjectName, certificateName, false);

    if (sel.Count == 0)
        throw new Exception($"No certificate found with name: certificateName");

    X509Certificate2 cert = sel.OfType<X509Certificate2>().OrderByDescending(pX => pX.NotAfter).First();

    store.Close();

    return cert;

此代码在 Windows 10 上运行良好,因此当客户有可用的 Windows 10 时,我们将 WCF 作为 Windows 服务托管在我们的生产环境中。

在 Windows 7 上,当 WCF 应用程序作为 Windows 服务托管时找不到证书。因此,我们通过将 WCF 应用程序托管为控制台应用程序来解决这个问题。我们需要弄清楚为什么它在 Windows 7 上不能作为 Windows 服务工作,尽管如果 WCF 应用程序作为控制台应用程序托管在同一环境中,它确实会找到证书。

【问题讨论】:

【参考方案1】:

导致找不到证书的原因可能是证书所在的位置。众所周知,我们搜索证书的条件是当前用户,证书存储位置是MY,当前用户就是当前登录用户。

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

当我们安装windows服务时,该用户可能是与当前登录用户不同的另一个用户。 所以我们最好搜索存储在LocalMachine中的证书,任何用户都可以找到它。 此外,我们可以使用 Certlm.msc 命令来管理 LocalMachine 中的证书。 如果有什么可以帮助的,请随时告诉我。

【讨论】:

没用。将“帐户”设置为“LocalSystem”仍然会出现找不到证书的错误。除了设置这个属性,我还需要做些什么吗? 您可以尝试将证书导出为fox文件,然后将证书导入本地机器,最后我们将搜索证书的位置更改为本地机器。或者您可以将帐户设置为 USER 并在安装 Windows 服务时使用主机\用户名作为凭据 Pfx 文件不是 fox 文件 对不起,X509Store 对象实例化在我的答案中与实际在我的代码中不同。我修好了它。基本上,我的代码只使用了 StoreLocation 参数。 知道了,但我认为导出证书不是一种选择,因为它安装在智能卡上。因此,当 SmartCart 连接到 USB 端口时,证书仅在 Windows 上有效。物理删除后,它也会自动从 Windows 应用商店中卸载。

以上是关于当 WCF 应用程序在 Windows 7 上作为 Windows 服务托管时,找不到证书的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Windows 7 上的 Windows 服务中使用 netNamedPipeBinding 托管和启动 WCF 服务

WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上

从作为 LocalSystem 运行的 WCF 托管服务以特定用户身份启动进程

WCF Web 服务调用的性能

连接到在另一台计算机上作为 Windows 服务运行的 WCF

使用 Silverlight 5、IIS 7.5 对 WCF 服务进行 Windows 身份验证