Pratinjau Pembaruan Kumulatif November 2020 untuk versi Windows 10 2004 dan yang lebih rendah, serta rilis Rollup Keamanan dan Kualitas Bulan Januari 2021 untuk .NET Framework 4.8 merilis perubahan untuk menyempurnakan proses pembersihan untuk sertifikat X509Certificate2. Di bawah ini, kami menyediakan klarifikasi tambahan tentang masa pakai kunci pribadi di Windows.
Sejak .NET Framework 2.0 ada dua cara berbeda untuk memuat sertifikat dan kunci privat terkait dari file PKCS#12 PFX: sebagai satu objek sertifikat melalui anggota di kelas X509Certificate2 atau semua sertifikat yang ada di PFX melalui metode X509Certificate2Collection.Import.
Perilaku defaultnya adalah kunci privat dimuat ke kunci yang tetap (bernama) melalui salah satu pustaka kriptografi sistem, yang secara tidak langsung menulis file ke disk. Sebagian besar penelepon yang memuat PFX hanya menggunakan objek sertifikat untuk sementara, jadi ketika .NET merilis sumber daya asli yang terkait dengan sertifikat, kunci privat juga akan dihapus. Pengecualian utama untuk perilaku ini adalah
-
Tanda X509KeyStorageFlags.PersistKeySet, yang menyebabkan file ditulis tetapi tidak dihapus,
-
Tanda X509KeyStorageFlags.EphemeralKetSet, yang menghasilkan kunci privat dimuat ke memori tanpa file cadangan,
-
Penghentian proses abnormal, yang dapat terjadi ketika penghapusan kunci tertunda.
Secara berlawanan, dua cara berbeda untuk memuat sertifikat selalu menggunakan mekanisme yang berbeda untuk melacak kapan waktu yang tepat untuk menghapus kunci privat. Memuat sertifikat tunggal melalui kelas X509Certificate2 menggunakan penanda yang hanya terlihat oleh runtime .NET, dan hanya berlaku untuk satu referensi objek tersebut. Memuat PFX melalui X509Certificate2Collection.Import menggunakan penanda pada objek sertifikat asli, yang mengakibatkan "akuntabilitas penghapusan" dibagikan di seluruh objek terkelola yang mewakili sertifikat asli yang sama. Ini berarti bahwa X509Certificate2(otherCert.Handle yang baru). Dispose() akan menyebabkan file kunci privat dihapus selama panggilan ke Dispose() jika OtherCert dimuat dari PFX melalui X509Certificate2Collection.Import, tetapi tidak jika dimuat dari PFX melalui anggota kelas X509Certificate2. Beberapa bagian dari .NET secara internal membuat X509Certificate2 objek yang dikelola baru dari gagang sertifikat asli, seperti kelas X509Chain dan metode X509Certificate2Collection.Find. Bagian-bagian kerangka kerja ini, dan bagian apa pun yang secara langsung atau tidak langsung menggunakannya, dapat mengakibatkan penghapusan kunci prematur saat objek yang mereka buat mengumpulkan sampah.
Bug diperkenalkan dalam rilis awal .NET Framework 4.8 yang mengakibatkan X509Certificate2Collection.Import tidak menerapkan penanda penghapusan meskipun persistKeySet maupun EphemeralKeySet tidak ditentukan. .NET merilis perbaikan untuk bug ini dalam Rollup Keamanan dan Kualitas Januari 2021 untuk mencegah akumulasi file kunci pribadi yang tidak disengaja. Penelepon yang terpengaruh oleh perbaikan ini dapat menentukan bendera PersistKeySet untuk kembali ke perilaku .NET Framework 4,8 RTM .NET Framework 4,8, meskipun demikian akan mengakibatkan akumulasi file yang perlu diatasi dengan logika pembersihan kustom.
X509Certificate2Collection.Import on .NET Core untuk Windows dan .NET 5+ untuk Windows bertingkah sama seperti .NET Framework 2.0-4.7.2 (dan .NET Framework 4.8 dengan semua pembaruan diterapkan). Tim .NET sedang mempertimbangkan untuk beralih ke desain yang disempurnakan di .NET 6 (atau versi yang akan datang), tetapi pembaruan desain ini tidak akan berlaku untuk .NET Framework, .NET Core, atau .NET 5.