Pregled kumulativne ispravke iz novembra 2020. za Windows 10 verziju 2004 i novije, kao i izdanje zbirne bezbednosne i kvalitativne ispravke iz januara 2021. za .NET Framework 4.8 objavilo je promenu radi poboljšanja procesa čišćenja za X509Certificate2 certifikate. U nastavku pružamo dodatna pojašnjenja o trajanju privatnog ključa u operativnom sistemu Windows.
Od .NET Framework 2.0 postoje dva različita načina za učitavanje certifikata i povezanog privatnog ključa iz PKCS#12 PFX datoteke: kao jedan objekat certifikata putem članova u klasi X509Certificate2 ili kao sve certifikate prisutne u PFX-u putem metoda X509Certificate2Collection.Import.
Podrazumevano ponašanje je da se privatni ključ učitava u trajni (imenovani) ključ putem jedne od sistemskih kriptografskih biblioteka, koja indirekto piše datoteku na disk. Većina pozivalaca koji učitava PFX privremeno koriste samo objekat certifikata, tako da kada .NET izdavanje izvornih resursa povezanih sa certifikatom briše i privatni ključ. Glavni izuzeci od ovog ponašanja su
-
X509KeyStorageFlags.PersistKeySet zastavica, što za rezultat ima pisanje, ali ne i brisanje datoteke,
-
X509KeyStorageFlags.EphemeralKetSet zastavica, što za rezultat ima učitavanje privatnog ključa u memoriju bez datoteke za rezervnu kopiju,
-
Nenormalno prekid procesa, što može da se desi kada je brisanje ključa na čekanju.
Suprotno tome, dva različita načina učitavanja certifikata uvek su koristila različite mehanizme za praćenje kada je odgovarajuće vreme za brisanje privatnog ključa. Učitavanje jednog certifikata putem klase X509Certificate2 koristi označivač koji je vidljiv samo u .NET izvršavanju i odnosi se samo na tu referencu na jedan objekat. Učitavanje PFX datoteke putem X509Certificate2Collection.Import koristi označivač na izvornom objektu certifikata, što za rezultat ima deljenje "odgovornosti za brisanje" u svim kontrolisanim objektima koji predstavljaju isti izvorni certifikat. To znači da je novi X509Certificate2(otherCert.Handle). Raspoređivanje() će dovesti do brisanja datoteke privatnog ključa tokom poziva funkcije Dispose() ako je drugiCert učitan iz PFX datoteke putem X509Certificate2Collection.Import, ali ne i ako je učitana iz PFX-a putem bilo kojih X509Certificate2 članova klase. Neki delovi programa .NET interno kreiraju nove kontrolisane X509Certificate2 objekte od izvornih regulatora certifikata, kao što su klasa X509Chain i metod X509Certificate2Collection.Find. Ti delovi radnog okvira i svi delovi koji ih direktno ili indirekto koriste, mogu dovesti do preranog brisanja ključa jer se objekti koje kreiraju prikupljaju smeće.
U početno izdanje programa .NET Framework 4.8 uvedena je greška koja je dovela do toga da X509Certificate2Collection.Import ne primenjuje označivač brisanja čak i ako nije naveden nijedan PersistKeySet ni EphemeralKeySet. .NET je objavio ispravku za ovu grešku u zbirnoj bezbednosnoj i kvalitativnoj ispravci iz januara 2021 . kako bi sprečio nenamernu akumulaciju napuštenih privatnih ključnih datoteka. Pozivaoci na koje upućuje ova ispravka mogu navesti PersistKeySet zastavicu da bi se vratili na ponašanje programa .NET Framework 4.8 RTM, iako će to dovesti do akumulacije datoteka koje treba da se reše pomoću logike prilagođenog čišćenja.
X509Certificate2Collection.Import na .NET Core za Windows i .NET 5+ za Windows se ponaša na isti način kao .NET Framework 2.0-4.7.2 (i .NET Framework 4.8 sa primenjenim svim ispravkama). .NET tim razmišlja da se prebaci na poboljšani dizajn u .NET 6 (ili budućim verzijama), ali ova ispravka dizajna se neće primeniti na .NET Framework, .NET Core ili .NET 5.