当尝试使用下面的代码来从X509Store
一个X509Certificate2
对象:.NET核心X509Certificate2.PrivateKey抛出NTE_BAD_KEYSET错误
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”标志,则最终会得到此行为(在密钥获得“未保留” )。 – bartonjs
我不使用.NET将证书添加到商店。 PFX文件被添加到商店并通过ACME应用程序进行更新。这是一个完全独立的过程,不属于我的项目。 – Middas
您确定您的IIS应用程序池用户有权访问此证书的私钥吗? –