c# - 在哪里存储 Windows 服务的 X509 证书?

标签 c# windows cryptography certificate x509

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

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

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

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

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

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

最佳答案

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

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

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

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

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

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

关于c# - 在哪里存储 Windows 服务的 X509 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784224/

相关文章:

windows - Inno Setup - 在执行 Google Chrome 时如何告诉安装,它应该打开 stackoverflow.com?

windows - Remove-Item 不起作用,Delete 起作用

对 Coinbase Exchange 私有(private) API 的 PHP 身份验证

c# - 使用 Roslyn 处理 C# 脚本时出现编译错误

c# - 验证 SQL 脚本的代码

c - 签名 Windows x64 驱动程序 - 系统找不到指定的文件

javascript - NodeJS aes 解密不工作

java - Android 6 crypto Cipher.update 不再像 Android 5 那样工作

c# - 了解 WCF IsOneWay、CalbackContracts 和 Duplex - 我的假设是否正确?

c# - 从 3.1.2 版升级到 5.0.3 版后,Entity Framework 核心 Include() 不起作用