Previzualizarea actualizării cumulative din noiembrie 2020 pentru Windows 10 versiunea 2004 și versiunile mai recente, precum și lansarea setului de actualizări 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 o durată de viață cheie privată în Windows.
Deoarece .NET Framework 2.0 au existat două modalități diferite de a încărca un certificat și cheia sa privată asociată dintr-un fișier PKCS#12 PFX: ca un obiect de certificat prin intermediul membrilor din clasa X509Certificate2 sau ca toate certificatele prezente în PFX prin metodele X509Certificate2Collection.Import.
Comportamentul implicit este ca cheia privată să fie încărcată într-o cheie persistentă (numită) printr-una dintre bibliotecile de criptografice de sistem, 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 cu certificatul, șterge și cheia privată. Principalele excepții de la acest comportament sunt
-
Semnalizatorul X509KeyStorageFlags.PersistKeySet, care duce la scrierea fișierului, dar nu și la ștergere,
-
Semnalizatorul X509KeyStorageFlags.EphemeralKetSet, care duce la încărcarea cheii private în memorie fără fișiere de backup,
-
Terminare anormală a procesului, care poate apărea atunci când ștergerea cheilor este în așteptare.
În mod contraintuitiv, cele două modalități diferite de a încărca certificate au utilizat întotdeauna mecanisme diferite pentru urmărire atunci când este momentul potrivit să ștergeți cheia privată. Încărcarea unui singur certificat prin clasa X509Certificate2 utilizează un marcator care este vizibil doar pentru runtime -ul .NET și se aplică doar la acea referință la un obiect. Încărcarea unui PFX prin X509Certificate2Collection.Import utilizează un marcator pe obiectul certificat nativ, ceea ce duce la partajarea "responsabilității ștergerii" între toate obiectele gestionate care reprezintă același certificat nativ. Aceasta înseamnă că X509Certificate2(otherCert.Handle) nou. Dispose() va face ca fișierul cheie privată să fie șters în timpul apelului către Dispose() dacă altCert a fost încărcat de la un PFX prin X509Certificate2Collection.Import, dar nu și dacă a fost încărcat dintr-un PFX prin toți membrii clasei X509Certificate2. Unele porțiuni din .NET creează intern noi obiecte X509Certificate2 gestionate din ghidajele de certificat native, cum ar fi clasa X509Chain și metoda X509Certificate2Collection.Find. Aceste porțiuni ale cadrului și orice porțiuni care le utilizează direct sau indirect pot duce la ștergerea prematură a cheii pe măsură ce obiectele pe care le creează sunt colectate deșeuri.
O eroare a fost introdusă în versiunea inițială de .NET Framework 4.8, care a dus la X509Certificate2Collection.Import pentru a nu aplica marcatorul de ștergere chiar dacă nu s-au specificat 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ă a fișierelor cheie private abandonate. Apelanții afectați de această remediere pot specifica semnalizarea PersistKeySet pentru a reveni la comportamentul (neintenționat diferit) .NET Framework 4.8 RTM, deși acest lucru va duce la acumularea de fișiere care trebuie tratată cu logica 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 versiunile viitoare), dar această actualizare de proiectare nu se va aplica pentru .NET Framework, .NET Core sau .NET 5.