Vijek trajanja privatnog ključa u sustavu Windows i skupno ažuriranje sigurnosti i kvalitete .NET Framework za siječanj 2021.

U pretpregledu kumulativnog ažuriranja za studeni 2020. za verziju 2004 Windows 10 i starijim te u izdanju skupnog ažuriranja sigurnosti i kvalitete za .NET Framework 4.8 iz siječnja 2021. objavljena je promjena za poboljšanje postupka čišćenja certifikata X509Certificate2. U nastavku dajemo dodatna pojašnjenja o životnom vijeku privatnog ključa u sustavu Windows.

Od verzije .NET Framework 2.0 postoje dva različita načina učitavanja certifikata i pridruženog privatnog ključa iz PKCS#12 PFX datoteke: kao jedan objekt certifikata putem članova klase X509Certificate2 ili kao svih certifikata prisutnih u PFX-u putem metoda X509Certificate2Collection.Import.

Zadano ponašanje je da se privatni ključ učitava u stalni (imenovani) ključ putem neke od kriptografskih biblioteka sustava, čime se neizravno zapisuje datoteka na disk.  Većina pozivatelja koji učitavaju PFX objekt koristi samo privremeno, pa kada .NET oslobađa nativne resurse povezane s certifikatom, briše i privatni ključ.  Glavne su iznimke od tog ponašanja

  1. zastavicu X509KeyStorageFlags.PersistKeySet koja rezultira zapisivanjem datoteke ali ne i brisanjem
  2. oznaku X509KeyStorageFlags.EphemeralKetSet koja rezultira učitavanjem privatnog ključa u memoriju bez datoteke sigurnosne kopije,
  3. Nenormalan prekid procesa koji se može dogoditi kada je brisanje ključa na čekanju.

Suprotno intuiciji, ta dva različita načina učitavanja certifikata uvijek su koristila 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 okruženje izvođenja .NET i primjenjuje se samo na tu referencu objekta.  Učitavanje PFX-a putem alata X509Certificate2Collection.Import koristi oznaku na objektu nativnog certifikata, što rezultira zajedničkom objavom "odgovornosti za brisanje" na svim upravljanim objektima koji predstavljaju isti nativni certifikat.  To znači da će novi X509Certificate2(otherCert.Handle). Dispose() će uzrokovati brisanje datoteke privatnog ključa tijekom poziva Dispose() ako je anotherCert učitan s PFX-a putem X509Certificate2Collection.Import, ali ne i ako je učitan s PFX-a putem bilo kojeg člana klase X509Certificate2.  Neki dijelovi platforme .NET interno stvaraju nove upravljane objekte X509Certificate2 iz nativnih 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četnom izdanju .NET Framework 4.8 uvedena je pogreška koja je rezultirala time da X509Certificate2Collection.Import nije primijenio oznaku brisanja čak i ako nisu bili navedeni ni PersistKeySet ni EphemeralKeySet. .NET je objavio popravak za ovu programsku pogrešku u skupnom ažuriranju sigurnosti i kvalitete u siječnju 2021 . kako bi spriječio nenamjerno nakupljanje napuštenih datoteka privatnog ključa.  Pozivatelji na koje taj popravak utječe mogu odrediti zastavicu PersistKeySet za povratak na (nenamjerno drugačije) ponašanje .NET Framework 4.8 RTM, iako će to rezultirati nakupljanjem datoteka koje se mora 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 .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 na .NET 6 (ili buduće verzije), ali ovo ažuriranje dizajna neće se odnositi na .NET Framework, .NET Core ili .NET 5.