A 2020. novemberi összegző frissítés előzetes verziója a Windows 10 2004-es és korábbi verziójához, valamint a .NET-keretrendszer 4.8-as verziójának 2021. januári biztonsági és minőségi összegző kiadása kiadott egy módosítást az X509Certificate2 tanúsítványok törlési folyamatának javítása érdekében. Az alábbiakban további pontosításokat adunk a titkos kulcsok élettartamáról a Windowsban.
A .NET-keretrendszer 2.0-s verziója óta kétféleképpen lehet betölteni egy tanúsítványt és a hozzájuk tartozó titkos kulcsot egy PKCS#12 PFX fájlból: egyetlen tanúsítványobjektumként az X509Certificate2 osztály tagjain keresztül vagy a PFX-ben található összes tanúsítványként az X509Certificate2Collection.Import metódussal.
Az alapértelmezett viselkedés az, hogy a rendszer egyik titkosítási könyvtárán keresztül a titkos kulcs betöltődik egy megőrzött (elnevezett) kulcsba, amely közvetetten fájlt ír a lemezre. A PFX-et betöltő hívók többsége csak ideiglenesen használja a tanúsítványobjektumot, így amikor a .NET felszabadítja a tanúsítványhoz társított natív erőforrásokat, a titkos kulcsot is törli. A fő kivételek ez alól a következők
- Az X509KeyStorageFlags.PersistKeySet jelző, amelynek hatására a fájl megíródik, de nem törlődik,
- Az X509KeyStorageFlags.EphemeralKetSet jelző, amelynek eredményeként a titkos kulcs biztonsági mentési fájl nélkül töltődik be a memóriába,
- Rendellenes folyamatleállás, amely akkor fordulhat elő, ha kulcs törlése van függőben.
Ellentmondásos módon a tanúsítványok betöltésének két különböző módja mindig eltérő mechanizmusokat használt annak nyomon követésére, hogy mikor van éppen megfelelő időpont a titkos kulcs törlésére. Egyetlen tanúsítványnak az X509Certificate2 osztályon keresztül való betöltése olyan jelölőt használ, amely csak a .NET-futtatókörnyezet számára látható, és csak arra az egy objektumhivatkozásra vonatkozik. A PFX X509Certificate2Collection.Import fájlon keresztül való betöltése egy jelölőt használ a natív tanúsítványobjektumon, ami azt eredményezi, hogy a "törlési felelősség" meg lesz osztva az ugyanazon natív tanúsítványt képviselő felügyelt objektumok között. Ez azt jelenti, hogy új X509Certificate2(otherCert.Handle). A Dispose() a titkoskulcs-fájl törlését okozza a Dispose() hívása során, ha az otherCert fájl PFX-ből lett betöltve az X509Certificate2Collection.Import fájlon keresztül, de nem, ha PFX-ből lett betöltve bármely X509Certificate2 osztálytagon keresztül. A .NET egyes részei belsőleg hoznak létre új felügyelt X509Certificate2 objektumokat natív tanúsítványleírókból, például az X509Chain osztályból és az X509Certificate2Collection.Find metódusból. A keretrendszernek ezek a részei, valamint az azokat közvetlenül vagy közvetve használó részek a kulcs idő előtti törlését eredményezhetik, mivel az általuk létrehozott objektumok szemétbe kerülnek.
A .NET-keretrendszer 4.8-as verziójának kezdeti kiadásában hiba vezethető be, amelynek eredményeképp az X509Certificate2Collection.Import nem alkalmazta a törlési jelölőt akkor sem, ha sem a PersistKeySet, sem az EphemeralKeySet nincs megadva. A .NET a 2021. januári biztonsági és minőségi összegző frissítésben kiadott egy javítást erre a hibára, hogy megakadályozza az elhagyott titkoskulcs-fájlok véletlen felhalmozódását. A javítás által érintett hívók megadhatják a PersistKeySet jelzőt, hogy visszatérjenek a .NET-keretrendszer 4.8-as RTM (nem szándékosan eltérő) viselkedéséhez, bár ez fájlfelhalmozódást eredményez, amelyet egyéni karbantartási logikával kell kezelni.
Az X509Certificate2Collection.Import a .NET Core for Windows és a .NET 5+ for Windows rendszer ugyanúgy működik, mint a .NET-keretrendszer 2.0–4.7.2 (és a .NET-keretrendszer 4.8, az összes frissítéssel együtt). A .NET csapata azt fontolgatja, hogy áttér a .NET 6 (vagy későbbi verziók) továbbfejlesztett kialakítására, de ez a tervezési frissítés nem fog vonatkozni a .NET-keretrendszer, a .NET Core és a .NET 5 rendszerekre.