2010-05-06 28 views
3

我有一个通常使用本地系统帐户运行的Windows服务(尽管在某些安装中它可能作为特定的用户帐户)。哪里存储Windows服务的X509证书?

该服务正在使用WCF,并使用X509证书进行通信保护。

我的问题是,哪里是存储证书(和私钥)的最佳位置?

如果使用证书存储是最好的方法,我应该使用哪一个来确保只有管理员和服务可以访问私钥?

或者,一个简单的选项是将两者都作为PFX文件存储在磁盘上,并使用ACL来确保只有管理员和服务才能访问它。这种方法与使用证书存储有什么区别?

编辑 为了澄清,我正在使用C#与所有的.NET Framework 3.5的

回答

2

首先,我建议你在保存非导出的私钥证书存储来保存证书。现在有些争论。

有不同的方法可以在机器上保存私人秘密或其他私人信息。最旧的方法是LsaStorePrivateDataLsaRetrievePrivateData API(请参阅http://msdn.microsoft.com/en-us/library/ms721818%28VS.85%29.aspx)。它对秘密数量有限制,但所有秘密可以分为本地,全球和机器。

接下来的方法是在我们的例子中使用DPAPI(见http://msdn.microsoft.com/en-us/library/ms995355.aspx):CryptProtectDataCryptUnprotectData

我为这两种方式添加引用,因为您想比较不同的可能方式,以确保您的方式是最适合您的任务。

我认为你应该问的最重要的问题是:哪个是保护我私钥的最好方法?我想你应该选择这样的方式,其中保护你的密钥被复制。所以我建议你使用证书存储。在证书商店中,您可以持有标记为的不可输出密钥。这是我认为的主要优势。您可以用不同的方式部署带有相应私钥的证书。请确保保存在机器上的私钥未标记为可输出

在磁盘上使用PFX文件不会带来这个好处。此外,您的PFX未加密,或者您收到问题,您应该将密码保存到PFX文件。因此您必须使用DPAPI(CryptProtectDataCryptUnprotectData)或LSA API(LsaStorePrivateDataLsaRetrievePrivateData),并且可以导出密码。

+2

“不可导出”标志并不真正增加安全性 - 使用像Jailbreak(www.isecpartners.com)这样的工具导出此类密钥并不重要。 – Cocowalla 2010-05-06 21:25:19

+0

@Cocowalla谢谢你的有趣信息!这对我来说是新的,我将搜索有关此工具的更多信息,但我不相信此工具可以从智能卡或其他硬件解决方案中导出私钥。原因智能卡不适合服务器的解决方案,但其他基于硬件的证书存储可以解决问题。而且,在Windows的下一个安全修复程序之后,越狱程序无法工作。为了说明信任,我不知道至少从体系结构方面来看证书存储更好的解决方案。 – Oleg 2010-05-06 21:44:44

+0

你说得对,Jailbreak不能从智能卡中输出。如果证书商店是最好的解决方案,我应该使用哪个商店?本地机器商店?这是如何得到保证的(也就是说,_who_可以访问私钥)? – Cocowalla 2010-05-06 21:47:44

相关问题