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 釋出與憑證相關聯的原生資源時,也會刪除私鑰。 此行為的主要例外是
-
X509KeyStorageFlags.PersistKeySet 標幟,導致檔案被撰寫但不會刪除,
-
X509KeyStorageFlags.EphemeralKetSet 旗標,導致私鑰載入至沒有備份檔案的記憶體中,
-
異常程序終止,可能會在金鑰刪除擱置中時發生。
相反地,當需要刪除私鑰時,載入憑證的兩種不同方式一律採用不同的機制來進行追蹤。 透過 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。