哪里可以存储Windows服务的X509证书?

时间:2010-05-06 20:25:56

标签: c# windows cryptography certificate x509

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

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

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

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

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

修改 为了澄清,我使用的是.NET Framework 3.5的C#

1 个答案:

答案 0 :(得分: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),并且可以导出密码。

相关问题