以编程方式使用私钥导入证书

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

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

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

请注意,这个问题略有关联,但我不认为权限是问题,因为这一切都是作为同一个Windows用户完成的: 如何从.NET设置X.509证书的私钥文件的读取权限

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

这是双向SSL吗? 如果是,那么您是否通过机器上生成的SSL证书申请文件发送? 此证书申请文件将用于创建SSL,它们一起形成公共私钥对。

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

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

这是一个MS聊天的链接,它提供了样本C#代码来执行httpcfg所做的事情,从而消除了部署工具的需要。