从 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
,但我无法从证书存储中取回两者...
知道如何让它工作吗?我是否需要在第二步中从证书库加载私钥?如何?
这些证书对我来说仍然主要是一个类似巫毒教的大谜.....谁能开导我?
首先要检查证书库是否有私钥。
- 打开证书管理管理单元并找到您的证书,双击它并确保它有红色突出显示的部分,如下图所示:
接下来,如果私钥在存储中,那么访问证书的帐户可能没有私钥的权限。有两种检查方法:
- 在证书管理管理单元中,右键单击证书 > 所有任务 > 管理私钥。 (您应该可以在此处检查和编辑权限)
- 在您的代码中,您可以访问私钥 属性(即执行 var privateKey = cert.PrivateKey 并查看是否取回)。
你没有写web服务是如何实现的。
- 如果部署在IIS上
- 如果是自托管
您从商店获取证书的代码是正确的。问题是您在哪里导入 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
我正在尝试获取此外部 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
,但我无法从证书存储中取回两者...
知道如何让它工作吗?我是否需要在第二步中从证书库加载私钥?如何?
这些证书对我来说仍然主要是一个类似巫毒教的大谜.....谁能开导我?
首先要检查证书库是否有私钥。
- 打开证书管理管理单元并找到您的证书,双击它并确保它有红色突出显示的部分,如下图所示:
接下来,如果私钥在存储中,那么访问证书的帐户可能没有私钥的权限。有两种检查方法:
- 在证书管理管理单元中,右键单击证书 > 所有任务 > 管理私钥。 (您应该可以在此处检查和编辑权限)
- 在您的代码中,您可以访问私钥 属性(即执行 var privateKey = cert.PrivateKey 并查看是否取回)。
你没有写web服务是如何实现的。
- 如果部署在IIS上
- 如果是自托管
您从商店获取证书的代码是正确的。问题是您在哪里导入 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