2

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

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

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

我可以X509Certificate2在我的 C# 代码中从证书商店获取 - 没问题:

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证书”......

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

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

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

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

4

2 回答 2

4

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

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

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

  1. 在证书管理管理单元中,右键单击证书 > 所有任务 > 管理私钥。(您应该能够在此处检查和编辑权限)
  2. 在您的代码中,您可以访问 PrivateKey 属性(即 Do var privateKey = cert.PrivateKey 并查看是否将其取回)。
于 2015-05-08T09:00:31.120 回答
0

您没有写 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

于 2015-05-08T10:42:17.833 回答