以编程方式完成时,http add sslcert失败

Tre*_*iel 5 c# ssl

我开发了一个自托管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)

正如我所说,当我用这些步骤手动完成时,我没有遇到问题......

  1. 项目清单
  2. 双击.pfx文件.
  3. MMC打开.
  4. 我选择"本地机器"
  5. 在下一个屏幕上,我确认.pfx文件的位置和名称.
  6. 我输入证书的密码,然后选择"包括所有扩展属性"
  7. 在下一个屏幕上,我让它默认为"根据证书类型自动选择证书存储"
  8. 然后我得到一个确认屏幕.
  9. 当我点击"完成"时,我收到一条消息"导入成功"

然后我可以在个人>证书下的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手动添加证书时,当我运行我的代码时,有些不同.阻止添加路线的东西.

mj2*_*008 1

解决方案实际上很简单 - 我也曾为此苦苦挣扎,现在已经找到了解决方案。手动添加的证书与以编程方式添加的证书有何不同?好吧,简短的答案是将您的证书加载行更改为:

X509Certificate2 cert = new X509Certificate2(file, password, X509KeyStorageFlags.MachineKeySet);
Run Code Online (Sandbox Code Playgroud)

密钥是最后一个参数,它告诉证书保存存储在计算机位置而不是用户位置的私钥。然后该netsh命令就可以找到私钥,并且可以工作。

Paul Stovell在解释性文本中找到了解决方案,并进行了一些挖掘,看看如何在将证书加载到商店时设置该标志。

现在,为什么我不能以编程方式执行 netsh 函数是另一回事......