【问题标题】:Import certificate with private key programmatically以编程方式导入带有私钥的证书
【发布时间】:2010-10-23 03:55:43
【问题描述】:

我正在尝试在 C# 应用程序中使用 HttpListener 类来让迷你网络服务器通过 SSL 提供内容。为此,我需要使用 httpcfg 工具。我有一个带有我的公钥和私钥对的 .pfx 文件。如果我使用 mmc 手动将此密钥对导入本地机器存储,则一切正常。但是,如果我使用 X509Store 类以编程方式导入此密钥对,我将无法连接到我的迷你网络服务器。请注意,在这两种方法中,证书都被导入到 LocalMachine 中的 MY 商店。奇怪的是,一旦我以编程方式导入该证书,我就可以在 mmc 中查看它,当我查看它时,UI 表明私钥也可用于此证书。

再深入一点,我注意到当我手动导入密钥对时,我可以看到C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys 中出现了一个新文件,但是当我以编程方式导入时没有出现。在相关说明中,当我删除手动导入的证书时,它不会从前面提到的目录中删除相应的私钥文件。

最终,我的问题是:当我以编程方式将证书添加到商店时,私钥存储在哪里,为什么 HttpListener 类 (HttpApi) 无法访问它?

请注意,这个问题有点相关,但我认为权限不是问题,因为这一切都是作为同一个 Windows 用户完成的: How to set read permission on the private key file of X.509 certificate from .NET

【问题讨论】:

    标签: c# .net ssl ssl-certificate


    【解决方案1】:

    不完全是您问题的答案,但在这里供其他人参考:

    Here 是一个 MS 聊天链接,它提供示例 C# 代码来执行 httpcfg 所做的工作,因此无需部署工具。

    【讨论】:

    • 谢谢,这是一个很好的链接。我简要地研究了这一点,但它只涉及如何使用 URLACL_SET 结构,而不是在我的场景中管理 SSL 配置所需的 SSL_SET 结构。不幸的是,SSL_SET 结构有点复杂,所以使用起来很麻烦,而 httpcfg 可执行文件更方便。
    【解决方案2】:

    好的,我想通了。它与证书对象的密钥存储参数有关。对于遇到此问题的其他任何人,请确保您使用 X509KeyStorageFlags.PersistKeySetX509KeyStorageFlags.MachineKeySet 标志构造了要添加到存储中的 X509Certificate2 对象。这将强制私钥保留在HttpApi 所需的机器密钥集位置(HttpListener 包装了它)。

    【讨论】:

    • 不幸的是,我必须等待 48 小时才能这样做,那时我可能会忘记这样做。 :(
    • 我浪费了大约 30 分钟试图弄清楚为什么“X509KeyStorageFlags.MachineKeySet & X509KeyStorageFlags.PersistKeySet”不起作用。当然应该是“X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet”。很明显,以防其他人尝试和我一样愚蠢的事情。
    • 有少量示例代码在:support.microsoft.com/kb/950090
    • @Jason 你不会相信你为我节省了多少时间。我已经进行了第二天的研究,整个互联网都是一个巨大的死胡同。谢谢!
    【解决方案3】:

    这是 2 路 SSL 吗?如果是,那么您是否发送了在您的机器上生成的 SSL 证书请求文件?此证书请求文件将用于创建 SSL,它们一起形成一个公钥私钥对。

    您是否还尝试为用于运行 Web 应用程序的用户帐户分配证书权限?您可以使用 Microsoft WSE 3.0 工具来做到这一点。

    【讨论】:

    • 我目前只是使用自生成的密钥对进行测试,因此涉及到这个证书请求。我还没有玩过任何相关的权限,因为所有这些都是作为同一个用户完成的(证书导入和运行网络服务器)。不涉及 IIS 或其他任何东西。
    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2012-02-26
    • 2011-05-28
    • 2015-01-20
    • 2013-05-16
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多