我已经通过c# (bouncycastle)创建了一个自签名SSL证书。它显示在本地计算机/个人存储中,看起来与微软已经存在的本地主机证书完全相同。如果我显示属性,它会显示:
SSL证书添加失败,错误:1312指定的登录会话失败不存在的。它可能已经被终止。
然而,如果我想通过netsh注册这个证书,我得到一个错误:
netsh.exe http add sslcert ipport=0.0.0.0:{0} certhash={1} appid={2}
app-id是在assemblyinfo.cs中指定的GUID。certhash
是来自证书属性页的哈希值。
我在许多博客文章中发现了这种情况发生的几个原因:
- 使用提升权限(我正在做这个)
- 确保您的证书注册在"本地计算机",而不是"当前用户"-我有这个。
- 确保证书有一个私钥(它有,正如它在属性对话框中显示的那样)。
您的问题出现在绑定之前。我认为证书没有正确导入。当你在c#中加载证书时,使用:
var cert = new X509Certificate2("Path", "Pwd, X509KeyStorageFlags.MachineKeySet
| X509KeyStorageFlags.PersistKeySet
| X509KeyStorageFlags.Exportable);
并确保将其存储在本地机器StoreLocation.LocalMachine
:
var store = new X509Store(storeName, StoreLocation.LocalMachine);
store.Open(OpenFlags.MaxAllowed);
store.Add(cert);
store.Close();
我今天有一个类似的问题,这是我如何解决它。当我在mmc.exe中查看本地计算机上安装的证书时,我看到我的证书没有带密钥的图标。
我组合*。Cer和*。PVK文件到*。可以用:
pvk2pfx -pvk "private_key.pvk" -spc "public.cert" -pfx "test.pfx"
然后导入*。PFX文件与mmc.exe.
那么下一个命令将执行,没有错误:
netsh http add sslcert...
netsh http delete sslcert...
您必须做的另一个检查是:您的证书是否位于"本地计算机"下的"个人"存储下?如果没有,则必须使用附加参数certstorename="<store>"
其中我以以下方式确定了作为<store>
传递的值:
- 打开MMC并为本地计算机帐户添加证书管理单元。
-
<store>
是证书所在文件夹的名称,当您通过此快照查看证书时。
默认情况下,certstorename的值为"MY",表示"Personal"文件夹。因此,如果你的证书在个人文件夹中,那么你就不需要添加这个参数。