Сборната актуализация от ноември 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(), ако otherCert е зареден от 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.