Windows 10 sürüm 2004 ve altına yönelik Kasım 2020 Toplu Güncelleştirme Önizlemesi'nin yanı sıra .NET Framework 4.8 için Ocak 2021 Güvenlik ve Kalite Paketi sürümü, X509Certificate2 sertifikaları için temizleme işlemini iyileştirmeye yönelik bir değişiklik yayımladı. Aşağıda, Windows'ta özel anahtar ömrü hakkında ek netleştirmeler sağlıyoruz.
.NET Framework 2.0'dan bu yana bir sertifikayı ve ilişkili özel anahtarını PKCS#12 PFX dosyasından yüklemek için iki farklı yol vardır: X509Certificate2 sınıfındaki üyeler aracılığıyla bir sertifika nesnesi olarak veya X509Certificate2Collection.Import yöntemleriyle PFX'te bulunan tüm sertifikalar olarak.
Varsayılan davranış, özel anahtarın kalıcı (adlandırılmış) bir anahtara, dolaylı olarak diske dosya yazan sistem şifreleme kitaplıklarından biri aracılığıyla yüklenmesidir. PFX yükleyerek çağıranların çoğu yalnızca sertifika nesnesini geçici olarak kullanır, bu nedenle .NET sertifikayla ilişkili yerel kaynakları serbest bıraktığında özel anahtarı da siler. Bu davranışın ana özel durumları şunlardır:
-
X509KeyStorageFlags.PersistKeySet bayrağı, dosyanın yazılmasıyla sonuçlanır ancak silinmez,
-
X509KeyStorageFlags.EphemeralKetSet bayrağı, özel anahtarın hiçbir yedekleme dosyası olmadan belleğe yüklenmesine neden olur,
-
Anahtar silme beklemede olduğunda gerçekleşebilen olağan dışı işlem sonlandırma.
Uygun olmayan şekilde, sertifikaları yüklemenin iki farklı yolu, özel anahtarı silmek için uygun bir zaman olduğunda izlemek için her zaman farklı mekanizmalar kullanmıştı. X509Certificate2 sınıfı aracılığıyla tek bir sertifika yüklenirken, yalnızca .NET çalışma zamanı tarafından görülebilen ve yalnızca bu nesne başvurusu için geçerli olan bir işaretçi kullanılır. X509Certificate2Collection.Import aracılığıyla PFX yüklenirken yerel sertifika nesnesinde bir işaretçi kullanılır ve bu da aynı yerel sertifikayı temsil eden yönetilen nesneler arasında "silme sorumluluğu" paylaşılmasını sağlar. Bu, yeni X509Certificate2(otherCert.Handle) anlamına gelir. X509Certificate2Collection.Import aracılığıyla bir PFX'ten başka Bir Sertifika yüklendiyse, dispose() çağrısı sırasında dispose() özel anahtar dosyasının silinmesine neden olur, ancak herhangi bir X509Certificate2 sınıf üyesi aracılığıyla pfx'ten yüklenmişse silinmez. .NET'in bazı bölümleri, X509Chain sınıfı ve X509Certificate2Collection.Find yöntemi gibi yerel sertifika tanıtıcılarından dahili olarak yeni yönetilen X509Certificate2 nesneleri oluşturur. Çerçevenin bu bölümleri ve bunları doğrudan veya dolaylı olarak kullanan tüm bölümler, oluşturdukları nesneler çöp toplandığı için erken anahtar silinmesine neden olabilir.
.NET Framework 4.8'in ilk sürümünde X509Certificate2Collection.Import dosyasının ne PersistKeySet ne de EphemeralKeySet belirtilse bile silme işaretçisini uygulamamasıyla sonuçlanan bir hata ortaya çıkmıştır. .NET, bırakılan özel anahtar dosyalarının yanlışlıkla birikmesini önlemek için Ocak 2021 Güvenlik ve Kalite Paketi'nde bu hataya yönelik bir düzeltme yayımladı. Bu düzeltmeden etkilenen arayanlar, 4,8 RTM davranışı .NET Framework (istemeden farklı) geri dönmek için PersistKeySet bayrağını belirtebilir, ancak bunu yapmak özel temizleme mantığıyla ele alınması gereken dosya birikimine neden olur.
Windows için .NET Core üzerinde X509Certificate2Collection.Import ve Windows için .NET 5+, .NET Framework 2.0-4.7.2 (ve tüm güncelleştirmelerin uygulandığı .NET Framework 4.8) ile aynı şekilde davranır. .NET ekibi .NET 6'da (veya gelecekteki sürümlerde) geliştirilmiş bir tasarıma geçmeyi düşünüyor, ancak bu tasarım güncelleştirmesi .NET Framework, .NET Core veya .NET 5 için geçerli olmayacaktır.