使用C#访问Windows服务证书库中的x509证书

时间:2012-01-26 22:42:08

标签: c# security x509certificate2

我想存储一个x509证书供Windows服务使用。我遇到的问题是存储此证书的位置。似乎使用Microsoft管理控制台(mmc)证书管理单元,您可以使用Windows服务特定证书存储。麻烦的是我无法弄清楚如何通过C#获得这些证书。

  • 使用mmc和证书管理单元在服务存储下安装证书。

使用topshelf使用以下代码创建并安装了Windows服务:

var localStore = new X509Store(StoreLocation.LocalMachine); 
localStore.Open(OpenFlags.ReadOnly);
foreach (X509Certificate2 c in localStore.Certificates)
{
    _log.Debug("local: certificate for {0} - has private key {1}".ToFormat(c.SubjectName.Name, c.HasPrivateKey));
}

var userStore = new X509Store(StoreLocation.CurrentUser); 
userStore.Open(OpenFlags.ReadOnly);
foreach (X509Certificate2 c in userStore.Certificates)
{
    _log.Debug("user: certificate for {0} - has private key {1}".ToFormat(c.SubjectName.Name, c.HasPrivateKey));
}

我永远不会在Windows服务的商店中看到证书。如果我将证书添加到本地计算机证书存储区,则Windows服务确实会看到证书。

mmc中用于向服务商店添加证书的所有花哨工具都必须具有目的。

1 个答案:

答案 0 :(得分:3)

Windows服务在运行MMC时以不同的用户帐户运行,这就是您在CurrentUser商店中看不到证书的原因;但请在LocalMachine商店中看到它。

解决此问题的一种方法是让Windows服务作为特定用户运行,比如'ServiceX'。然后,将MMC作为“ServiceX”运行,并将证书添加到当前用户存储中。