Forhåndsvisningen af kumulativ opdatering for november 2020 til Windows 10 version 2004 og nedenfor samt sikkerheds- og kvalitetsopdateringen for januar 2021 til .NET Framework 4.8 har udgivet en ændring for at forbedre oprydningsprocessen for X509Certificate2-certifikater. Nedenfor giver vi yderligere præciseringer af en privat nøglelevetid på Windows.
Da .NET Framework 2.0 har der været to forskellige måder at indlæse et certifikat og dets tilknyttede private nøgle fra en PKCS#12 PFX-fil: som ét certifikatobjekt via medlemmer på X509Certificate2-klassen eller som alle certifikater, der findes i PFX via X509Certificate2Collection.Importmetoder.
Standardfunktionsmåden er, at den private nøgle indlæses i en fast (navngivet) nøgle via et af systemkryptografibibliotekerne, som indirekte skriver en fil til disken. De fleste, der indlæser en PFX, bruger kun certifikatobjektet midlertidigt, så når .NET frigiver de oprindelige ressourcer, der er knyttet til certifikatet, slettes den private nøgle også. De vigtigste undtagelser til denne funktionsmåde er
-
Flaget X509KeyStorageFlags.PersistKeySet, som medfører, at filen bliver skrevet, men ikke slettet,
-
X509KeyStorageFlags.EphemeralKetSet-flaget, som medfører, at den private nøgle indlæses i hukommelsen uden en sikkerhedskopifil.
-
Unormal procesafslutning, som kan forekomme, når sletning af nøgler venter.
Modsat har de to forskellige måder at indlæse certifikater altid brugt forskellige mekanismer til sporing, når det er et passende tidspunkt at slette den private nøgle. Indlæsning af et enkelt certifikat via X509Certificate2-klassen bruger en markør, der kun er synlig for .NET-runtime, og som kun gælder for den pågældende objektreference. Indlæser en PFX via X509Certificate2Collection.Import bruger en markør på det oprindelige certifikatobjekt, hvilket medfører, at "sletningskontolighed" deles på tværs af administrerede objekter, der repræsenterer det samme oprindelige certifikat. Det betyder, at den nye X509Certificate2(otherCert.Handle). Dispose() medfører, at den private nøglefil slettes under opkaldet til Dispose(), hvis otherCert blev indlæst fra en PFX via X509Certificate2Collection.Import, men ikke hvis den blev indlæst fra en PFX via X509Certificate2-klassemedlemmer. Nogle dele af .NET internt opretter nye administrerede X509Certificate2-objekter fra oprindelige certifikathandles, f.eks. X509Chain-klassen og metoden X509Certificate2Collection.Find. Disse dele af rammen og eventuelle dele, der direkte eller indirekte bruger dem, kan resultere i for tidlig sletning af nøgler, da de objekter, de skaber, får indsamlet affald.
Der blev introduceret en fejl i den første udgivelse af .NET Framework 4.8, hvilket resulterede i X509Certificate2Collection.Import for ikke at anvende sletningsmarkøren, selvom hverken PersistKeySet eller EphemeralKeySet blev angivet. .NET frigav en rettelse til denne fejl i sikkerheds- og kvalitetsopdateringen for januar 2021 for at forhindre utilsigtet akkumulering af forladte private nøglefiler. Opkaldere, der påvirkes af denne rettelse, kan angive PersistKeySet-flaget for at vende tilbage til (utilsigtet anderledes) .NET Framework 4.8 RTM-funktionsmåde, men hvis du gør det, medfører det akkumulering af filer, der skal håndteres med brugerdefineret oprydningslogik.
X509Certificate2Collection.Import på .NET Core til Windows og .NET 5+ til Windows fungerer på samme måde som .NET Framework 2.0-4.7.2 (og .NET Framework 4.8, hvor alle opdateringer er installeret). .NET-teamet overvejer at skifte til et forbedret design i .NET 6 (eller fremtidige versioner), men denne designopdatering gælder ikke for .NET Framework, .NET Core eller .NET 5.