Durata de viață a cheii private în Windows și setul de actualizări de securitate și calitate .NET Framework din ianuarie 2021

Previzualizarea actualizării cumulative din noiembrie 2020 pentru Windows 10, versiunea 2004 și versiunile mai vechi, precum și lansarea setului de securitate și calitate din ianuarie 2021 pentru .NET Framework 4.8 au lansat o modificare pentru a îmbunătăți procesul de curățare pentru certificatele X509Certificate2. Mai jos, oferim clarificări suplimentare cu privire la durata de viață a cheii private în Windows.

De la .NET Framework 2.0, există două moduri diferite de a încărca un certificat și cheia sa privată asociată dintr-un fișier PFX PKCS#12: ca obiect de certificat prin membrii din clasa X509Certificate2 sau ca toate certificatele prezente în PFX prin metodele X509Certificate2Collection.Import.

Comportamentul implicit este acela că cheia privată este încărcată într-o cheie persistentă (denumită) prin una dintre bibliotecile de criptografie a sistemului, care scrie indirect un fișier pe disc.  Majoritatea apelanților care încarcă un PFX utilizează doar temporar obiectul certificat, astfel încât atunci când .NET eliberează resursele native asociate certificatului, șterge și cheia privată.  Principalele excepții de la acest comportament sunt

  1. Semnalizatorul X509KeyStorageFlags.PersistKeySet, care duce la scrierea, dar nu și ștergerea fișierului,
  2. Semnalizatorul X509KeyStorageFlags.EphemeralKetSet, care duce la încărcarea cheii private în memorie fără niciun fișier de suport,
  3. Terminare anormală a procesului, care poate apărea atunci când ștergerea cheii este în așteptare.

Contraintuitiv, cele două moduri diferite de a încărca certificate au utilizat întotdeauna mecanisme diferite pentru a urmări momentul potrivit pentru a șterge cheia privată.  Încărcarea unui singur certificat prin clasa X509Certificate2 utilizează un marcator care este vizibil doar pentru modulul runtime .NET și se aplică doar acelei referințe de obiect.  Încărcarea unui PFX prin X509Certificate2Collection.Import utilizează un marcator pe obiectul certificat nativ, care duce la partajarea "responsabilității pentru ștergere" între toate obiectele gestionate care reprezintă același certificat nativ.  Acest lucru înseamnă că noul X509Certificate2(otherCert.Handle). Dispose() va determina ștergerea fișierului cheie privată în timpul apelului către Dispose() dacă otherCert a fost încărcat de la un PFX prin X509Certificate2Collection.Import, dar nu și dacă a fost încărcat de la un PFX prin intermediul oricăror membri ai clasei X509Certificate2.  Unele porțiuni de .NET creează intern noi obiecte X509Certificate2 gestionate din handle-urile de certificate native, cum ar fi clasa X509Chain și metoda X509Certificate2Collection.Find.  Aceste porțiuni din cadru și toate porțiunile care le utilizează direct sau indirect pot avea drept consecință ștergerea prematură a cheii, deoarece obiectele pe care le creează sunt colectate de gunoi.

A apărut o eroare în versiunea inițială de .NET Framework 4.8, care a făcut ca X509Certificate2Collection.Import să nu aplice marcatorul de ștergere chiar dacă nu erau specificate nici PersistKeySet, nici EphemeralKeySet. .NET a lansat o remediere pentru această eroare în setul de securitate și calitate din ianuarie 2021 , pentru a preveni acumularea neintenționată de fișiere cheie privată abandonate.  Apelanții afectați de această remediere pot specifica semnalizatorul PersistKeySet pentru a reveni la comportamentul (diferit în mod neintenționat) .NET Framework 4.8 RTM, însă acest lucru va avea ca rezultat o acumulare de fișiere care trebuie tratată cu o logică de curățare particularizată.

X509Certificate2Collection.Import pe .NET Core pentru Windows și .NET 5+ pentru Windows se comportă la fel ca .NET Framework 2.0-4.7.2 (și .NET Framework 4.8 cu toate actualizările aplicate).  Echipa .NET ia în considerare trecerea la un design îmbunătățit în .NET 6 (sau în versiunile viitoare), dar această actualizare de design nu se va aplica la .NET Framework, .NET Core sau .NET 5.