我开发了一个自托管api.
api流量需要通过SSL运行.
使用netsh命令的组合我已成功添加证书,然后将路由绑定到我的服务.快乐的时光.
但是,我必须编写一个安装程序来以编程方式执行此操作.
问题是,当我使用我的c#代码添加证书时,我可以看到证书MMC,但是当我尝试绑定到它时,我得到一个错误:
SSL Certificate add failed, Error: 1312
A specified log-on session does not exist. It may already have been terminated.
Run Code Online (Sandbox Code Playgroud)
正如我所说,当我用这些步骤手动完成时,我没有遇到问题......
然后我可以在个人>证书下的MMC中看到它
它允许我从命令提示符 - Happy Days使用netsh添加路由.
当我尝试使用以下代码以编程方式执行此操作时:
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; }
}
Run Code Online (Sandbox Code Playgroud)
证书出现在我的MMC中完全相同的地方,但是当我尝试使用与之前完全相同的netsh命令添加路由时,我得到上述错误:
netsh>http add sslcert ipport=0.0.0.0:8088 certhash=fb93ce2c4d8bd88c82e63e3372a050ba84f15e94 appid={bb14356a-a14f-4589-82ce-b80d38b8741e}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我使用MMC手动添加证书时,当我运行我的代码时,有些不同.阻止添加路线的东西.
解决方案实际上很简单 - 我也曾为此苦苦挣扎,现在已经找到了解决方案。手动添加的证书与以编程方式添加的证书有何不同?好吧,简短的答案是将您的证书加载行更改为:
X509Certificate2 cert = new X509Certificate2(file, password, X509KeyStorageFlags.MachineKeySet);
Run Code Online (Sandbox Code Playgroud)
密钥是最后一个参数,它告诉证书保存存储在计算机位置而不是用户位置的私钥。然后该netsh命令就可以找到私钥,并且可以工作。
Paul Stovell在解释性文本中找到了解决方案,并进行了一些挖掘,看看如何在将证书加载到商店时设置该标志。
现在,为什么我不能以编程方式执行 netsh 函数是另一回事......
| 归档时间: |
|
| 查看次数: |
1358 次 |
| 最近记录: |