我开发了一个自托管的 api。
api 流量需要通过 SSL 运行。
使用 netsh 命令的组合,我成功地添加了证书,然后将路由绑定(bind)到我的服务。快乐的日子。
但是,我必须编写一个安装程序以编程方式执行此操作。
问题是,当我使用我的 C# 代码添加证书时,我可以看到它是证书 MMC,但是当我尝试绑定(bind)到它时,出现以下错误:
SSL Certificate add failed, Error: 1312
A specified log-on session does not exist. It may already have been terminated.
正如我所说,当我通过这些步骤手动执行时,我没有遇到问题...
- 列表项
- 双击 .pfx 文件。
- MMC 打开。
- 我选择“本地机器”
- 在下一个屏幕上,我确认 .pfx 文件的位置和名称。
- 我输入证书的密码并选择“包括所有扩展属性”
- 在下一个屏幕上,我让它默认为“根据证书类型自动选择证书存储”
- 然后我会看到一个确认屏幕。
- 当我点击“完成”时,我收到一条消息“导入成功”
然后我可以在 MMC 的“个人”>“证书”下看到它
它让我可以在命令提示符下使用 netsh 添加路由 - Happy Days。
当我尝试使用以下代码以编程方式执行此操作时:
public static bool ConfigureSSLCertificate(string file, string password, string method)
{
try
{
X509Certificate2 cert = new X509Certificate2(file, password);
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
if (!store.Certificates.Contains(cert))
{
if (method == "add")
{
store.Add(cert);
}
}
if (method == "remove")
{
store.Remove(cert);
}
return true;
}
catch { return false; }
}
证书出现在我的 MMC 中完全相同的位置,但是当我尝试使用与之前完全相同的 netsh 命令添加路由时,出现上述错误:
netsh>http add sslcert ipport=0.0.0.0:8088 certhash=fb93ce2c4d8bd88c82e63e3372a050ba84f15e94 appid={bb14356a-a14f-4589-82ce-b80d38b8741e}
出于某种原因,当我使用 MMC 手动添加证书时,当我运行我的代码时,情况有所不同。阻止添加路由的东西。
最佳答案
解决方案实际上很简单 - 我也曾为此苦苦挣扎,现在找到了解决方案。手动添加的证书与以编程方式添加的证书有何不同?好吧,简短的回答是将您的证书加载行更改为:
X509Certificate2 cert = new X509Certificate2(file, password, X509KeyStorageFlags.MachineKeySet);
key 是最后一个参数,它告诉证书将私钥保存在机器位置,而不是用户位置。然后netsh
命令可以找到私钥,并且可以工作。
Paul Stovell 在解释性文本中找到了解决方案并深入研究如何在将证书加载到商店时设置该标志。
现在,为什么我不能以编程方式执行 netsh 函数是另一回事...
关于c# - 以编程方式完成时,http 添加 sslcert 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24098673/