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

时间:2018-11-08 16:36:01

标签: c# wcf windows-7 windows-services windows-10

我们有一个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 Service托管在生产环境中。

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

1 个答案:

答案 0 :(得分:1)

导致未能找到证书的原因可能是证书的位置。如您所知,我们搜索证书的条件是当前用户,并且证书存储位置是MY,当前用户是当前登录用户。

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

当用户安装Windows服务时,该用户可能是与当前登录用户不同的另一个用户。
enter image description here
因此,我们最好搜索存储在LocalMachine中的证书,并且任何用户都可以找到它。
此外,我们可以使用Certlm.msc命令来管理LocalMachine中的证书。
随时让我知道是否有什么可以帮助您的。