【发布时间】:2017-05-19 16:25:58
【问题描述】:
当尝试使用以下代码从X509Store 获取X509Certificate2 对象时:
private X509Certificate2 GetKey()
{
try
{
X509Store store = new X509Store("WebHosting", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var collection = store.Certificates.Find(X509FindType.FindBySubjectName, "xxxxxxx", true);
if (collection.Count == 0)
{
throw new Exception("No keys matched");
}
if (collection.Count > 1)
{
StringBuilder sb = new StringBuilder();
sb.Append("More than 1 key matched:\r\n");
foreach (var cert in collection)
{
sb.Append($"{cert.SubjectName} - {cert.Thumbprint}\r\n");
}
throw new Exception(sb.ToString());
}
return collection[0];
}
catch (Exception ex)
{
// something really bad happened, log it
Logger.LogException(ex);
throw;
}
}
我成功拿到了钥匙;但是,当尝试使用 key.PrivateKey 获取对象中的私钥时,我收到以下错误:OpenCSP failed with error code 2148073494. 查找 Windows 错误 2148073494,我收到 nte_bad_keyset。看起来在其他情况下出现了错误,引发了同样的错误here,但他们已经修复了该错误。当我在控制台应用程序中运行这段代码时,它可以正常工作,并且在我在 IISExpress 下运行的测试环境中也可以正常工作。在 IIS 下的生产环境中运行时,我每次都会收到此错误。我试过在管理员用户的上下文中运行,只是为了确保这不是一个奇怪的权限错误,同样的事情。根据我对这个 Windows 错误的理解,Windows 给了我密钥所在的位置,然后告诉我那个地址没有任何东西。我为此使用"System.Security.Cryptography.Algorithms": "4.3.0"。
编辑:我应该注意,作为我的测试的一部分,我实际上从生产环境中获取了我正在寻找的确切证书到我的测试环境中并且它加载得很好。我还在生产环境中运行控制台应用程序,拉取相同的密钥,它运行良好。
【问题讨论】:
-
证书是如何进入生产机器的?如果您使用 .NET 读取 PFX 并将其添加到证书存储区,但在加载 PFX 时未设置
X509KeyStorageFlags.PersistKeySet标志,您最终会得到此行为(在密钥“未持久化”之后)。 -
我不使用 .NET 将证书添加到商店。 PFX 文件被添加到商店并通过 ACME 应用程序更新。这是一个完全独立的过程,不属于我的项目。
-
您确定您的 IIS 应用程序池用户有权访问此证书的私钥吗?
标签: c# .net-core private-key x509certificate2