我们有一个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服务托管在我们的生产环境中。
但是,在Windows7上,当应用程序作为Windows托管时,无法找到证书。因此,我们通过将WCF应用程序托管为控制台应用程序来解决这个问题。我们需要弄清楚为什么它不能作为Windows 7上的Windows服务工作,尽管如果WCF应用程序作为控制台应用程序托管在同一个环境中,它会找到证书。
发布于 2018-11-09 08:23:12
未能找到证书的原因可能是证书的所在地。如您所知,我们搜索证书的条件是当前用户,证书存储位置是MY,当前用户是当前登录用户。
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
当我们安装windows服务时,用户可能是与当前登录用户不同的另一个用户。
因此,我们最好搜索存储在LocalMachine中的证书,任何用户都可以找到它。
此外,我们还可以使用Certlm.msc命令来管理LocalMachine中的证书。
如果有什么需要我帮忙的,请随时通知我。
https://stackoverflow.com/questions/53212188
复制相似问题