Verze Preview kumulativní aktualizace pro Windows 10 verze 2004 a novější z listopadu 2020 a kumulativní aktualizace zabezpečení a zvýšení kvality z ledna 2021 pro rozhraní .NET Framework 4.8 vydala změnu pro zlepšení procesu čištění certifikátů X509Certificate2. Níže uvádíme další vysvětlení týkající se životnosti privátního klíče ve Windows.
Od .NET Framework 2.0 existují dva různé způsoby načtení certifikátu a jeho přidruženého privátního klíče ze souboru PKCS#12 PFX: jako jeden objekt certifikátu prostřednictvím členů ve třídě X509Certificate2 nebo jako všechny certifikáty přítomné v PFX pomocí X509Certificate2Collection.Import metod.
Ve výchozím nastavení se privátní klíč načte do trvalého (pojmenovaného) klíče prostřednictvím jedné ze systémových kryptografických knihoven, která nepřímo zapisuje soubor na disk. Většina volajících, kteří načítají PFX, používá objekt certifikátu pouze dočasně, takže když .NET vydává nativní prostředky přidružené k certifikátu, odstraní také privátní klíč. Hlavními výjimkami tohoto chování jsou
-
Příznak X509KeyStorageFlags.PersistKeySet, jehož výsledkem je zápis souboru, ale neodstraní se
-
Příznak X509KeyStorageFlags.EphemeralKetSet, jehož výsledkem je načtení privátního klíče do paměti bez záložního souboru,
-
Neobvyklé ukončení procesu, ke kterému může dojít, když čeká na odstranění klíče.
Neintuitivní je, že dva různé způsoby načítání certifikátů vždy používaly různé mechanismy pro sledování, když je vhodná doba k odstranění privátního klíče. Načtení jednoho certifikátu prostřednictvím třídy X509Certificate2 používá značku, která je viditelná pouze pro modul runtime .NET a vztahuje se pouze na tento jeden odkaz na objekt. Načtení PFX přes X509Certificate2Collection.Import používá značku na objektu nativního certifikátu, což vede ke sdílení "odpovědnosti za odstranění" mezi všemi spravovanými objekty, které představují stejný nativní certifikát. To znamená, že nový X509Certificate2(otherCert.Handle). Dispose() způsobí vymazání souboru privátního klíče během volání Dispose(), pokud byl otherCert načten z PFX prostřednictvím X509Certificate2Collection.Import, ale ne, pokud byl načten z PFX prostřednictvím členů X509Certificate2 třídy. Některé části rozhraní .NET interně vytvářejí nové spravované objekty X509Certificate2 z nativních popisovačů certifikátů, jako je třída X509Chain a metoda X509Certificate2Collection.Find. Tyto části architektury a všechny části, které je přímo nebo nepřímo používají, můžou vést k předčasnému vymazání klíče, protože objekty, které vytvoří, budou uvolněny z paměti.
V počáteční verzi rozhraní .NET Framework 4.8 byla zavedena chyba, která způsobila, že X509Certificate2Collection.Import nepoužije značku odstranění, i když nebyla zadána sada PersistKeySet ani EphemeralKeySet. Rozhraní .NET vydalo opravu této chyby v kumulativní aktualizaci zabezpečení a zvýšení kvality z ledna 2021 , aby se zabránilo neúmyslnému hromadění souborů opuštěných privátních klíčů. Volající, na které se tato oprava týká, mohou určit příznak PersistKeySet pro návrat k (neúmyslně odlišnému) chování rozhraní .NET Framework 4.8 RTM, i když to povede k nahromadění souborů, které je potřeba vyřešit pomocí vlastní logiky čištění.
X509Certificate2Collection.Import v .NET Core pro Windows a .NET 5+ pro Windows se chová stejně jako .NET Framework 2.0-4.7.2 (a rozhraní .NET Framework 4.8 se všemi použitými aktualizacemi). Tým .NET uvažuje o přechodu na vylepšený návrh v .NET 6 (nebo v budoucích verzích), ale tato aktualizace návrhu se nebude vztahovat na .NET Framework, .NET Core ani .NET 5.