De preview-versie van de cumulatieve update van november 2020 voor Windows 10 versie 2004 en lager, evenals de release van het beveiligings- en kwaliteitspakket van januari 2021 voor .NET Framework 4.8 hebben een wijziging uitgebracht om het opschoonproces voor X509Certificate2-certificaten te verbeteren. Hieronder geven we aanvullende uitleg over de levensduur van een persoonlijke sleutel in Windows.
Sinds .NET Framework 2.0 zijn er twee verschillende manieren om een certificaat en de bijbehorende persoonlijke sleutel uit een PKCS#12 PFX-bestand te laden: als één certificaatobject via leden in de klasse X509Certificate2 of als alle certificaten die aanwezig zijn in de PFX via de X509Certificate2Collection.Import-methoden.
Het standaardgedrag is dat de persoonlijke sleutel wordt geladen in een persistente (benoemde) sleutel via een van de cryptografiebibliotheken van het systeem, die indirect een bestand naar de schijf schrijft. De meeste aanroepers die een PFX laden, gebruiken het certificaatobject alleen tijdelijk, dus wanneer .NET de systeemeigen resources uitgeeft die zijn gekoppeld aan het certificaat, wordt ook de persoonlijke sleutel verwijderd. De belangrijkste uitzonderingen op dit gedrag zijn
-
De vlag X509KeyStorageFlags.PersistKeySet, waardoor het bestand wordt geschreven maar niet wordt verwijderd,
-
De vlag X509KeyStorageFlags.EphemeralKetSet, waardoor de persoonlijke sleutel in het geheugen wordt geladen zonder back-upbestand,
-
Abnormale procesbeëindiging, die kan optreden wanneer sleutelverwijdering in behandeling is.
De twee verschillende manieren om certificaten te laden hebben altijd verschillende mechanismen gebruikt voor het bijhouden wanneer het een geschikt moment is om de persoonlijke sleutel te verwijderen. Bij het laden van één certificaat via de klasse X509Certificate2 wordt een markering gebruikt die alleen zichtbaar is voor de .NET-runtime en alleen van toepassing is op die ene objectverwijzing. Het laden van een PFX via X509Certificate2Collection.Import maakt gebruik van een markering op het systeemeigen certificaatobject, waardoor 'verwijderingsverantwoordelijkheid' wordt gedeeld tussen alle beheerde objecten die hetzelfde systeemeigen certificaat vertegenwoordigen. Dit betekent dat de nieuwe X509Certificate2(otherCert.Handle). Dispose() zorgt ervoor dat het bestand met de persoonlijke sleutel wordt gewist tijdens de aanroep naar Dispose() als otherCert is geladen van een PFX via X509Certificate2Collection.Import, maar niet als het is geladen vanuit een PFX via een X509Certificate2-klasseleden. Sommige gedeelten van .NET maken intern nieuwe beheerde X509Certificate2-objecten op basis van systeemeigen certificaathandgrepen, zoals de klasse X509Chain en de methode X509Certificate2Collection.Find. Deze gedeelten van het framework en eventuele gedeelten die ze direct of indirect gebruiken, kunnen leiden tot voortijdige sleutelverwijdering omdat de objecten die ze maken, afval verzamelen.
Er is een fout geïntroduceerd in de eerste release van .NET Framework 4.8. Dit heeft ertoe geleid dat X509Certificate2Collection.Import de verwijderingsmarkering niet toepast, zelfs niet als persistKeySet en EphemeralKeySet niet zijn opgegeven. .NET heeft een oplossing voor deze fout uitgebracht in het beveiligings- en kwaliteitsrollup van januari 2021 om de onbedoelde accumulatie van verlaten privésleutelbestanden te voorkomen. Bellers die worden beïnvloed door deze oplossing kunnen de vlag PersistKeySet opgeven om terug te keren naar het (onbedoeld anders) .NET Framework 4.8 RTM-gedrag, hoewel dit leidt tot bestandsaccumulatie die moet worden opgelost met aangepaste opschoonlogica.
X509Certificate2Collection.Import op .NET Core voor Windows en .NET 5+ voor Windows gedraagt zich op dezelfde manier als .NET Framework 2.0-4.7.2 (en .NET Framework 4.8 waarop alle updates zijn toegepast). Het .NET-team overweegt over te stappen op een verbeterd ontwerp in .NET 6 (of toekomstige versies), maar deze ontwerpupdate is niet van toepassing op .NET Framework, .NET Core of .NET 5.