Предварителен преглед на кумулативната актуализация от ноември 2020 г. за Windows 10 версия 2004 и по-нови, както и изданието на сборен пакет за актуализация на защитата и качеството от януари 2021 г. за .NET Framework (платформа) 4.8 издаде промяна, за да подобри процеса на почистване за сертификати X509Certificate2. По-долу предоставяме допълнителни разяснения относно жизнения цикъл на личния ключ в Windows.
Тъй като .NET Framework (платформа) 2.0 има два начина за зареждане на сертификат и свързания с него личен ключ от PKCS#12 PFX файл: като един обект на сертификат чрез членове на клас X509Certificate2 или като всички сертификати, налични в PFX чрез методите X509Certificate2Collection.Import.
Поведението по подразбиране е, че личният ключ се зарежда в съхраним (именуван) ключ чрез една от системните библиотеки за криптография, която непряко записва файл на диска. Повечето повикващи, зареждащи PFX, използват обекта на сертификата само временно, така че когато .NET освобождава присъщите ресурси, свързани със сертификата, той изтрива и личния ключ. Основните изключения от това поведение са:
-
Флагът X509KeyStorageFlags.PersistKeySet, който води до записване на файла, но не и изтриване,
-
Флагът X509KeyStorageFlags.EphemeralKetSet, който води до зареждане на личния ключ в паметта без файл за архивиране.
-
Необичайно прекратяване на процеса, което може да възникне, когато изтриването на ключа е в изчакване.
В обратен смисъл двата различни начина за зареждане на сертификати винаги са използвали различни механизми за проследяване кога е подходящото време за изтриване на личния ключ. Зареждането на един сертификат чрез клас X509Certificate2 използва маркер, който е видим само за изпълнимия модул на .NET и се отнася само за тази препратка към обект. Зареждането на PFX чрез X509Certificate2Collection.Import използва маркер върху обекта на местния сертификат, което води до споделяне на "отчетност за изтриване" във всички управлявани обекти, които представляват един и същ основен сертификат. Това означава, че новият X509Certificate2(otherCert.Handle). Dispose() ще доведе до изтриване на файла с личен ключ по време на повикването за Dispose(), ако другCert е бил зареден от PFX чрез X509Certificate2Collection.Import, но не и ако е бил зареден от PFX чрез всички членове на класа X509Certificate2. Някои части от .NET създават вътрешно нови управлявани X509Certificate2 обекти от основни манипулатори на сертификати, като например класа X509Chain и метода X509Certificate2Collection.Find. Тези части от рамката, както и всички части, които ги използват пряко или косвено, могат да доведат до преждевременно изтриване на ключовете, тъй като създадените от тях обекти получават събрани отпадъци.
В първоначалното издание на .NET Framework (платформа) 4.8 беше въведена грешка, която доведе до X509Certificate2Collection.Import, за да не се приложи маркерът за изтриване, дори ако не са зададени нито PersistKeySet, нито EphemeralKeySet. .NET издаде корекция за тази грешка в сборен пакет за актуализация на защитата и качеството от януари 2021 г., за да предотврати неволното натрупване на файлове с изоставени лични ключове. Повикващите, засегнати от тази корекция, могат да зададете флага PersistKeySet, който да се върне към (неумишлено различно) .NET Framework (платформа) поведението на 4.8 RTM, въпреки че това ще доведе до натрупване на файлове, което трябва да бъде адресирано с логиката за почистване по избор.
X509Certificate2Collection.Import в .NET Core за Windows и .NET 5+ за Windows се държи по същия начин като .NET Framework (платформа) 2.0-4.7.2 (и .NET Framework (платформа) 4.8 с приложени актуализации). Екипът на .NET обмисля преминаването към подобрен дизайн в .NET 6 (или бъдещи версии), но тази актуализация на дизайна няма да се прилага за .NET Framework (платформа), .NET Core или .NET 5.