12

我正在尝试在 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

4

3 回答 3

29

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

于 2009-05-01T17:24:19.667 回答
0

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

您是否还尝试为用于运行 Web 应用程序的用户帐户分配证书权限?您可以使用 Microsoft WSE 3.0 工具来执行此操作。

于 2009-05-01T17:07:52.310 回答
0

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

是一个 MS 聊天的链接,它提供了示例 C# 代码来执行 httpcfg 所做的工作,从而消除了对部署工具的需要。

于 2009-05-01T18:00:06.927 回答