I förhandsversionen av den kumulativa uppdateringen för november 2020 för Windows 10 version 2004 och senare samt den samlade säkerhets- och kvalitetsuppdateringen för januari 2021 för .NET Framework 4.8 släpptes en ändring för att förbättra rensningsprocessen för X509Certificate2-certifikat. Nedan ger vi ytterligare förtydliganden om livslängden för en privat nyckel i Windows.
Sedan .NET Framework 2.0 har det funnits två olika sätt att läsa in ett certifikat och dess tillhörande privata nyckel från en PKCS#12 PFX-fil: som ett certifikatobjekt via medlemmar i klassen X509Certificate2 eller som alla certifikat som finns i PFX via X509Certificate2Collection.Import-metoderna.
Standardbeteendet är att den privata nyckeln läses in i en beständiga (namngiven) nyckel via ett av systemkryptografibiblioteken, som indirekt skriver en fil till disken. De flesta uppringare som läser in en PFX-fil använder bara certifikatobjektet tillfälligt, så när .NET släpper inbyggda resurser som är associerade med certifikatet tas även den privata nyckeln bort. De huvudsakliga undantagen till det här beteendet är
-
Flaggan X509KeyStorageFlags.PersistKeySet, som resulterar i att filen skrivs men inte tas bort,
-
Flaggan X509KeyStorageFlags.EphemeralKetSet, som resulterar i att den privata nyckeln läses in i minnet utan bakgrundsfil.
-
Avvikande processavslutande, vilket kan inträffa när viktig borttagning väntar.
Kontraintuitivt har de två olika sätten att läsa in certifikat alltid använt olika mekanismer för att spåra när det är en lämplig tid att ta bort den privata nyckeln. När ett certifikat läses in via klassen X509Certificate2 används en markör som bara är synlig för .NET runtime, och den gäller bara för den objektreferensen. Läser in en PFX via X509Certificate2Collection.Import använder en markör på det ursprungliga certifikatobjektet, vilket resulterar i att "borttagningsansvar" delas över alla hanterade objekt som representerar samma ursprungliga certifikat. Det innebär att nya X509Certificate2(otherCert.Handle). Kassera() gör att den privata nyckelfilen raderas under samtalet att kassera() om otherCert lästes in från en PFX via X509Certificate2Collection.Import, men inte om den lästes in från en PFX via någon X509Certificate2-klassmedlemmar. Vissa delar av .NET skapar internt nya hanterade X509Certificate2-objekt från interna certifikathandtag, till exempel klassen X509Chain och X509Certificate2Collection.Find. Dessa delar av ramverket, och alla delar som direkt eller indirekt använder dem, kan leda till för tidig nyckel radering som de objekt de skapar får skräp samlas in.
Ett fel introducerades i den första versionen av .NET Framework 4.8 vilket resulterade i att X509Certificate2Collection.Import inte använde borttagningsmarkören även om varken PersistKeySet eller EphemeralKeySet angavs. .NET släppte en korrigering för det här felet i den samlade säkerhets- och kvalitetsuppdateringen i januari 2021 för att förhindra oavsiktlig ackumulering av övergivna privata nyckelfiler. Uppringare som påverkas av den här korrigeringen kan ange flaggan PersistKeySet för att återgå till (oavsiktligt annorlunda) .NET Framework 4.8 RTM-beteende, men om du gör det skapas filackumulering som måste åtgärdas med anpassad rensningslogik.
X509Certificate2Collection.Import på .NET Core för Windows och .NET 5+ för Windows fungerar på samma sätt som .NET Framework 2.0-4.7.2 (och .NET Framework 4.8 med alla uppdateringar tillämpade). .NET-teamet överväger att övergå till en förbättrad design i .NET 6 (eller framtida versioner), men den här designuppdateringen gäller inte för .NET Framework, .NET Core eller .NET 5.