當嘗試使用下面的代碼來從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應用程序池用戶有權訪問此證書的私鑰嗎? –