Pretpregled kumulativnog ažuriranja za Windows 10 2004 i novije verzije iz studenog 2020., kao i izdanje skupnog ažuriranja sigurnosti i kvalitete iz siječnja 2021. za .NET Framework 4.8 objavilo je promjenu radi poboljšanja postupka čišćenja za certifikate X509Certificate2. U nastavku nudimo dodatna pojašnjenja o životu privatnog ključa u sustavu Windows.

Od .NET Framework 2.0 postoje dva različita načina učitavanja certifikata i povezanog privatnog ključa iz PKCS#12 PFX datoteke: kao jedan objekt certifikata putem članova na klasi X509Certificate2 ili kao svi certifikati koji se nalaze u PFX-u putem metoda X509Certificate2Collection.Import.

Zadano je da se privatni ključ učitava u postojani (imenovani) ključ putem jedne od sistemskih kriptografskih biblioteka, čime se neizravno zapisuje datoteka na disk.  Većina pozivatelja koji učitavaju PFX samo privremeno koristi objekt certifikata, pa kada .NET izdaje nativne resurse povezane s certifikatom, izbrisat će i privatni ključ.  Glavne iznimke za to ponašanje su

  1. Zastavica X509KeyStorageFlags.PersistKeySet, koja rezultira zapisivanjem datoteke, ali ne i brisanjem,

  2. Zastavica X509KeyStorageFlags.EphemeralKetSet, što rezultira učitavanjem privatnog ključa u memoriju bez datoteke za sigurnosno kopiranje,

  3. Nenormalan prekid procesa, koji se može pojaviti kada je brisanje ključa na čekanju.

Kontraintuitivno, dva različita načina učitavanja certifikata uvijek koriste različite mehanizme za praćenje kada je pravo vrijeme za brisanje privatnog ključa.  Učitavanje jednog certifikata putem klase X509Certificate2 koristi oznaku koja je vidljiva samo za .NET vrijeme izvođenja i odnosi se samo na tu jednu referencu objekta.  Učitavanje PFX-a putem X509Certificate2Collection.Import koristi oznaku na objektu nativnog certifikata, što rezultira omogućivanje zajedničkog korištenja odgovornosti za brisanje na svim upravljanim objektima koji predstavljaju isti izvorni certifikat.  To znači da je novi X509Certificate2(otherCert.Handle). Dispose() će uzrokovati brisanje datoteke privatnog ključa tijekom poziva u Dispose() ako je drugiCert učitan iz PFX-a putem X509Certificate2Collection.Import, ali ne i ako je učitan iz PFX-a putem bilo kojeg člana klase X509Certificate2.  Neki dijelovi .NET interno stvaraju nove upravljane objekte X509Certificate2 iz izvornih ručica certifikata, kao što su klasa X509Chain i metoda X509Certificate2Collection.Find.  Ti dijelovi okvira i svi dijelovi koji ih izravno ili neizravno koriste mogu dovesti do preranog brisanja ključa jer se objekti koje stvaraju prikupljaju smeće.

U početno izdanje sustava .NET Framework 4.8 uvedena je programska pogreška koja je rezultirala x509Certificate2Collection.Import da se oznaka brisanja ne bi primijenila čak i ako nisu navedeni persistKeySet ni EphemeralKeySet. .NET je objavio popravak za tu programsku pogrešku u skupnom ažuriranju sigurnosti i kvalitete iz siječnja 2021 . da bi se spriječilo nenamjerno nakupljanje napuštenih datoteka privatnog ključa.  Pozivatelji na koje utječe ovaj popravak mogu navesti zastavicu PersistKeySet da bi se vratili na ponašanje (nenamjerno drugačije) .NET Framework 4.8 RTM, no to će rezultirati nakupljanjem datoteka koje je potrebno riješiti prilagođenom logikom čišćenja.

X509Certificate2Collection.Import na .NET Core za Windows i .NET 5+ za Windows ponaša se na isti način kao i .NET Framework 2.0-4.7.2 (i .NET Framework 4.8 sa svim primijenjenim ažuriranjima).  Tim za .NET razmišlja o prelasku na poboljšani dizajn u .NET 6 (ili budućim verzijama), ali ovo ažuriranje dizajna neće se primijeniti na .NET Framework, .NET Core ili .NET 5.

Potrebna vam je dodatna pomoć?

Želite dodatne mogućnosti?

Istražite pogodnosti pretplate, pregledajte tečajeve za obuku, saznajte kako zaštititi uređaj i još mnogo toga.