3

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

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

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

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

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

编辑 为了澄清,我将 C# 与 .NET Framework 3.5 一起使用

4

1 回答 1

2

首先,我建议您将证书保存在证书存储中,并将私钥保存为不可导出。现在有些争论。

有多种方法可以在机器上保存私人秘密或其他私人信息。最古老的方法是LsaStorePrivateDataAPI LsaRetrievePrivateData(参见http://msdn.microsoft.com/en-us/library/ms721818%28VS.85%29.aspx)。它对秘密的数量有限制,但所有秘密都可以分为本地、全局和机器。

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

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

我认为您应该问的最重要的问题是:保护我的私钥的最佳方法是什么?我认为您应该选择保护您的密钥被复制的方式。所以我建议你使用证书存储。在证书存储中,您可以持有标记为non exportable的私钥。这是我认为的主要优势。您可以通过不同的方式部署具有相应私钥的证书。请确保,保存在机器上的私钥未标记为可导出

Using of PFX file on disk gives you not this advantage. Moreover either your PFX is not encrypted or you receive a problem where you should save the password to the PFX file. So you have to use DPAPI (CryptProtectData and CryptUnprotectData) or LSA API (LsaStorePrivateData and LsaRetrievePrivateData) and the password can be exported.

于 2010-05-06T21:18:52.703 回答