【问题标题】:Where to store X509 certificate for Windows service?Windows 服务的 X509 证书存储在哪里?
【发布时间】:2010-05-06 20:25:56
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# windows cryptography certificate x509


    【解决方案1】:

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

    有多种方法可以在机器上保存私人机密或其他私人信息。最古老的方式是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

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

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

    使用磁盘上的 PFX 文件不会给您带来这种优势。此外,您的 PFX 未加密或您收到问题您应该将密码保存到 PFX 文件的位置。所以你必须使用DPAPI(CryptProtectDataCryptUnprotectData)或LSA API(LsaStorePrivateDataLsaRetrievePrivateData)并且可以导出密码。

    【讨论】:

    • “不可导出”标志并没有真正增加安全性 - 使用 Jailbreak (www.isecpartners.com) 之类的工具导出此类密钥是微不足道的。
    • @Cocowalla 感谢您提供有趣的信息!这对我来说是新的,我会搜索更多关于这个工具的信息,但我不相信这个工具可以从智能卡或其他硬件解决方案中导出私钥。原因是智能卡不适合服务器的解决方案,但其他基于硬件的证书存储可以解决问题。此外,在 Windows 的下一个安全修复程序之后,越狱无法继续工作。为了告诉信任,我不知道至少从架构方面作为证书存储更好的解决方案。
    • 越狱无法从智能卡导出,您说得对。如果证书存储是最佳解决方案,我应该使用哪个存储?本地机器商店?这是如何保护的(也就是说,就可以访问私钥而言)?
    • 好问题,一开始您可以使用真正标准的证书存储,如果您的安全要求更高,您可以选择另一个。此外,我永远不会将系统帐户用于 WFC 服务作为最终解决方案。如果服务在用户帐户下运行,并且您拥有对机器的完全访问权限和管理权限,您也可以窃取密钥。然而,没有犯罪能量的人将能够访问私钥。所以我更喜欢用户证书存储。
    • 虽然我倾向于同意并且不喜欢使用系统帐户......但在大多数情况下,该服务仍然使用本地系统帐号
    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-05-02
    • 2013-02-10
    相关资源
    最近更新 更多