从 Windows 服务器证书库加载服务器端证书 * 和 * 私钥?

Loading a server-side certificate *and* a private key from Windows Server cert store?

我正在尝试获取此外部 REST web 服务,它需要服务器端证书和私钥(我从发布者那里获得的两者都是该服务的 *.pem 文件)。

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

现在我正试图将其放入我的产品 Windows Server 2008 的证书库中。

我可以在我的 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();

但是当我这样做时,网络服务向我吐口水,声称它需要 "SSL certificate"...

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

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

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

这些证书对我来说仍然主要是一个类似巫毒教的大谜.....谁能开导我?

首先要检查证书库是否有私钥。

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

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

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

你没有写web服务是如何实现的。

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

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

But when I do this, then the web service barfs at me, claiming it needs a "SSL certificate"...

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

Also: when I was loading the X509Certificate2 from disk, from that *.pfx file, I had to provide a password - nothing needs to be provided here, when loading from the cert store.... odd....

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

@DanL 关于私钥的权利和他的

可能是正确的

1) - 设置私钥权限和

2) - 访问 X509Certificate2 中的私钥

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