Förhandsversionen av kumulativ uppdatering för november 2020 för Windows 10 version 2004 och tidigare samt den samlade säkerhets- och kvalitetsuppdateringen för januari 2021 för .NET Framework 4.8 släppte 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 associerade 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 metoderna X509Certificate2Collection.Import.
Standardbeteendet är att den privata nyckeln läses in i en beständig (namngiven) nyckel via ett av systemkryptografibiblioteken, som indirekt skriver en fil till disken. De flesta anropare som läser in en PFX använder bara certifikatobjektet tillfälligt, så när .NET släpper de interna resurser som är associerade med certifikatet tas även den privata nyckeln bort. De viktigaste undantagen från 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 någon backfil,
- Onormal processavslutning, som kan inträffa när nyckelborttagning väntar.
Kontraintuitivt har de två olika sätten att läsa in certifikat alltid använt olika mekanismer för spårning när det är en lämplig tidpunkt att ta bort den privata nyckeln. Om du läser in ett enskilt certifikat via X509Certificate2 klassen används en markör som bara är synlig för .NET-körningen och endast gäller för den enda objektreferensen. Vid inläsning av en PFX via X509Certificate2Collection.Import används en markör i det interna certifikatobjektet, vilket resulterar i att "borttagningsansvar" delas mellan alla hanterade objekt som representerar samma interna certifikat. Det innebär att nya X509Certificate2(otherCert.Handle). Dispose() gör att den privata nyckelfilen raderas under anropet till Dispose() 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-klassmedlem. Vissa delar av .NET skapar internt nya hanterade X509Certificate2-objekt från interna certifikatreferenser, till exempel X509Chain klassen och X509Certificate2Collection.Find metoden. De här delarna av ramverket, och alla delar som direkt eller indirekt använder dem, kan resultera i för tidig nyckelradering eftersom objekten de skapar samlas in skräp.
Ett fel infördes i den första versionen av .NET Framework 4.8 som resulterade i X509Certificate2Collection.Import att inte använda 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 januari 2021 för att förhindra oavsiktlig ackumulering av övergivna privata nyckelfiler. Anropare som påverkas av den här korrigeringen kan ange flaggan PersistKeySet för att återgå till (oavsiktligt annorlunda) .NET Framework 4.8 RTM-beteendet, men gör det resulterar i filackumulering som måste hanteras 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 gå över 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.