Windows 10 版本 2004 及以下的 2020 年 11 月累積更新預覽 版,以及 .NET Framework 4.8 的 2021 年 1 月安全性和質量匯總套件發行,都發行了一項變更,以改善 X509Certificate2 憑證的清理程式。 在下方,我們針對 Windows 上的私人金鑰存留期提供額外的說明。

自 .NET Framework 2.0 起,從 PKCS#12 PFX 檔案載入憑證及其相關聯私鑰的方式有兩種:透過 X509Certificate2 類別中的成員,或透過 X509Certificate2Collection.Import 方法在 PFX 中呈現的所有憑證,以單一憑證物件的方式。

默認的行為是,私鑰會透過其中一個系統密碼編譯庫載入名為) 鍵的持續 (,而系統密碼編譯庫會間接將檔案寫入磁碟。  大部分載入 PFX 的來電者只會暫時使用憑證物件,因此當 .NET 釋出與憑證相關聯的原生資源時,也會刪除私鑰。  此行為的主要例外是

  1. X509KeyStorageFlags.PersistKeySet 標幟,導致檔案被撰寫但不會刪除,

  2. X509KeyStorageFlags.EphemeralKetSet 旗標,導致私鑰載入至沒有備份檔案的記憶體中,

  3. 異常程序終止,可能會在金鑰刪除擱置中時發生。

相反地,當需要刪除私鑰時,載入憑證的兩種不同方式一律採用不同的機制來進行追蹤。  透過 X509Certificate2 類別載入單一憑證時,會使用只有 .NET 運行時間可見的標記,而且只適用於該單一物件參照。  透過 X509Certificate2Collection.Import 載入 PFX 時,會在原生憑證物件上使用標記,導致在代表相同原生憑證的任何受管理對象上共用「刪除責任」。  這表示新的 X509Certificate2 (otherCert.Handle) 。如果從 PFX 透過 X509Certificate2Collection.Import 載入了其他密鑰檔案,則處置 () 會導致私鑰檔案在呼叫 [處置] () 時遭到清除,但若是透過任何 X509Certificate2 類別成員從 PFX 載入,則不會。  .NET 內部的某些部分會從原生憑證控點建立新受管理的 X509Certificate2 物件,例如 X509Chain 類別和 X509Certificate2Collection.Find 方法。  架構的這些部分,以及直接或間接使用它們的任何部分,都可能會在它們建立的物件被收集垃圾郵件時,導致獲得重要的清除。

在 .NET Framework 4.8 的初始版本中引入錯誤,導致 X509Certificate2Collection.Import 無法套用刪除標記,即使未指定 PersistKeySet 或 EphemeralKeySet。 .NET 在 2021 年 1 月安全性和質量匯總套 件中發佈了此錯誤的修正程式,以防止遺棄的私鑰檔案意外累積。  受此修正影響的來電者可以指定 PersistKeySet 標幟,以便在無意中回到 (不同的) .NET Framework 4.8 RTM 行為,不過這麼做會導致檔案累積,需要使用自定義清理邏輯來解決。

X509Certificate2Collection.Import on .NET Core for Windows and .NET 5+ for Windows 的行為方式與 .NET Framework 2.0-4.7.2 (和 .NET Framework 4.8 相同,已套用所有更新) 。  .NET 小組考慮移至 .NET 6 (或未來版本) 的改良設計,但此設計更新不適用於 .NET Framework、.NET Core 或 .NET 5。

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。