【问题标题】:Loading a server-side certificate *and* a private key from Windows Server cert store?从 Windows Server 证书存储区加载服务器端证书 * 和 * 私钥?
【发布时间】:2015-07-19 02:41:14
【问题描述】:

我正在尝试获取这个需要服务器端证书和私钥的外部 REST Web 服务(我从发布者那里获得了该服务的 *.pem 文件)。

为了我的测试,我在谷歌上搜索并找到了一种将这两个部分组合成一个 *.pfx 文件的方法 - 并从磁盘上的二进制文件加载一个 X509Certificate2 实例就可以了。

现在我正试图将它放入我的生产 Windows Server 2008 上的 Cert Store。

我可以从我的 C# 代码中的证书存储区获取 X509Certificate2 - 没问题:

X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySerialNumber, "serial-number-here", false);

if (certs.Count > 0)
{
    X509Certificate2 cert = certs[0];

    // set the certificate on the RestClient to call my REST service
    _restClient.ClientCertificates.Add(cert);
}

store.Close();

但是当我这样做时,Web 服务会向我吐槽,声称它需要“SSL 证书”......

另外:当我从磁盘加载X509Certificate2 时,从那个*.pfx 文件中,我必须提供密码 - 从证书存储加载时,这里不需要提供任何内容......奇怪...... ..

似乎即使我导入了包含服务器端证书和我们的私钥的*.pfx,但不知何故我无法从证书存储中取回两者...

知道如何让它工作吗?我是否需要在第二步中从证书存储中加载私钥?如何?

这些证书对我来说仍然主要是一个像巫毒一样的大谜.....谁能启发我?

【问题讨论】:

    标签: certificate x509certificate certificate-store


    【解决方案1】:

    您没有写 Web 服务是如何实现的。

    1. 如果部署在 IIS 上
    2. 如果它是自托管的

    您从商店获取证书的代码是正确的。问题是您在哪里导入 pfx - CurrentUser 或 LocalMachine 存储。您在代码示例中使用 CurrentUser 存储。如果您将证书导入 LocalMachine 存储,则不会找到它。另外,请在 X509Store 的构造函数中指定商店名称 - StoreName.My(在 MMC 或 certmgr.msc 中表示 Personal)(它可能是默认值,但无论如何谁知道所有默认值 :))

    但是当我这样做时,网络服务会向我吐槽,声称它 需要“SSL证书”...

    您需要确保您在证书的扩展密钥用法中有Client Authentication

    另外:当我从磁盘加载 X509Certificate2 时,从 *.pfx 文件,我必须提供密码 - 从证书存储加载时,这里不需要提供任何内容......奇怪......

    这就是它的工作原理。当您拥有 pfx 时,其中的私钥会使用密码进行保护/加密(密码可以是空字符串)。当您将 pfx 导入证书存储时,私钥会使用其他密钥进行保护/加密(不完全确定它是什么密钥)。但是,您可以通过在将 pfx 导入存储时指定强保护来为私钥添加另一级别的保护(我不建议在与 ASP.NET、Web 服务或任何没有桌面的东西一起使用时使用它)。但是,当它是您的个人证书来签署电子邮件时,启用它可能会很好。每当应用程序尝试使用私钥时,Windows 都会弹出一个窗口。

    @DanL 关于私钥和他的权限可能是正确的

    1) - 设置私钥和权限

    2) - 访问 X509Certificate2 中的私钥

    都写好了。我只想添加到 1) 您正在尝试从 ASP.NET 应用程序或 IIS 上的其他 Web 服务连接到 REST 服务,那么您需要为其添加权限的帐户名称是 IIS APPPOOL\name_of_the_apppool_your_app_runs_under

    【讨论】:

      【解决方案2】:

      首先要检查的是证书存储是否有私钥。

      1. 打开证书管理快照并找到您的证书,双击它并确保它具有红色突出显示的部分,如下图所示:

      接下来,如果私钥在存储中,那么访问证书的帐户可能对私钥没有权限。有两种方法可以检查:

      1. 在证书管理管理单元中,右键单击证书 > 所有任务 > 管理私钥。 (您应该可以在此处检查和编辑权限)
      2. 在您的代码中,您可以访问 PrivateKey 属性(即执行 var privateKey = cert.PrivateKey 并查看您是否将其取回)。

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 1970-01-01
        • 2022-12-18
        • 2019-12-06
        • 2013-05-30
        • 2012-10-25
        • 2011-12-16
        • 2012-12-25
        • 2018-04-19
        相关资源
        最近更新 更多