【问题标题】:c# X509Certificate2 add certificate how mark as exportablec# X509Certificate2 添加证书如何标记为可导出
【发布时间】:2014-06-23 12:57:35
【问题描述】:

我有一个 .NET 4.0 程序,它在端口 9000 上运行 localhost。 我想支持 SSL 并有一个要导入的 .pfx 证书。

因为程序在多台计算机上运行,​​程序本身负责 存储证书并注册其端口。

当程序导入和注册时,一切正常。 但是当我重新启动计算机时,https 连接不起作用......更多......

事件查看器给出以下错误:

尝试访问 SSL 服务器时发生致命错误 凭证私钥。从返回的错误代码 密码模块是 0x8009030D。内部错误状态为 10001。

对端点使用 SSL 配置时出错 0.0.0.0:9000。错误状态码包含在返回的数据中。

我找到了一些解决方案,说明您需要在导入时将证书标记为“可导出” 但我在代码中找不到如何做到这一点。

Website 1Website 2

存储证书:

String path = String.Concat(IOHelper.AssemblyPath, @"\certificate.pfx");
X509Certificate2 cert = new X509Certificate2(path, "password");

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);

if(!store.Certificates.Contains(cert))
{
    store.Add(cert);
}

注册主机:

netsh http add sslcert ipport=0.0.0.0:9000 certhash=<cert hash> appid=<app id>

【问题讨论】:

    标签: c# ssl localhost x509certificate netsh


    【解决方案1】:

    X509Certificate2 标记为可导出实际上非常简单。添加第三个参数 (X509KeyStorageFlags.Exportable),表示证书是可导出的。

    var cert = new X509Certificate2(path, "password", X509KeyStorageFlags.Exportable);
    

    【讨论】:

      【解决方案2】:

      除了 Madeillei 的回答,您还可以传递以下标志:

      var cert = new X509Certificate2(path, "password", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable| X509KeyStorageFlags.MachineKeySet);
      

      如果您将证书存储在 CurrentUser 存储而不是 LocalMachine 存储中,请执行以下操作:

      var cert = new X509Certificate2(path, "password", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable| X509KeyStorageFlags.UserKeySet);
      

      键集标志指示如下:

          //
          // Summary:
          //     Private keys are stored in the current user store rather than the local computer
          //     store. This occurs even if the certificate specifies that the keys should go
          //     in the local computer store.
          UserKeySet = 1,
          //
          // Summary:
          //     Private keys are stored in the local computer store rather than the current user
          //     store.
          MachineKeySet = 2,
      

      私钥需要与证书的其余部分位于同一位置才能正常工作。

      【讨论】:

      • 感谢上帝,我找到了这个答案,这让我非常抓狂。本地机器 |可出口 | PersistKeySet 组合是我的问题。我正在尝试多种标志组合以及多种证书存储导入方法,但在我找到此评论之前这不起作用。非常感谢!
      猜你喜欢
      • 2013-04-17
      • 2012-05-25
      • 2021-06-08
      • 2011-12-17
      • 2017-09-02
      • 2020-06-29
      • 1970-01-01
      • 2011-01-05
      • 2015-11-28
      相关资源
      最近更新 更多