Предварительная версия накопительного пакета накопительных обновлений за ноябрь 2020 г. для Windows 10 версии 2004 и более поздних версий, а также пакет обновления для системы безопасности и качества за январь 2021 г. для платформа .NET Framework 4.8 выпустили изменения, направленные на улучшение процесса очистки сертификатов X509Certificate2. Ниже приведены дополнительные пояснения о времени существования закрытого ключа в Windows.

С платформа .NET Framework 2.0 существует два разных способа загрузки сертификата и связанного с ним закрытого ключа из PFX-файла PKCS#12: как один объект сертификата через члены класса X509Certificate2 или как все сертификаты, присутствующие в PFX с помощью методов X509Certificate2Collection.Import.

По умолчанию закрытый ключ загружается в сохраненный (именованный) ключ через одну из системных библиотек шифрования, которая косвенно записывает файл на диск.  Большинство вызывающих лиц, загружающих PFX, используют объект сертификата только временно, поэтому, когда .NET освобождает собственные ресурсы, связанные с сертификатом, он также удаляет закрытый ключ.  Main исключения из этого поведения:

  1. Флаг X509KeyStorageFlags.PersistKeySet, в результате которого файл записывается, но не удаляется.

  2. Флаг X509KeyStorageFlags.EphemeralKetSet, который приводит к загрузке закрытого ключа в память без резервного файла.

  3. Аномальное завершение процесса, которое может произойти при ожидании удаления ключа.

Нелогичным является то, что два разных способа загрузки сертификатов всегда использовали разные механизмы отслеживания, когда нужно удалить закрытый ключ.  При загрузке одного сертификата через класс X509Certificate2 используется маркер, видимый только для среды выполнения .NET, и применяется только к одной ссылке на объект.  При загрузке PFX-файла через X509Certificate2Collection.Import используется маркер для собственного объекта сертификата, что приводит к совместному использованию всех управляемых объектов, представляющих один и тот же собственный сертификат.  Это означает, что новый X509Certificate2(otherCert.Handle). Dispose() приведет к удалению файла закрытого ключа во время вызова Dispose(), если другой Сертификат был загружен из PFX через X509Certificate2Collection.Import, но не был загружен из PFX через любые члены класса X509Certificate2.  Некоторые части .NET внутренне создают новые управляемые объекты X509Certificate2 из дескрипторов собственных сертификатов, таких как класс X509Chain и метод X509Certificate2Collection.Find.  Эти части платформы и все части, которые прямо или косвенно используют их, могут привести к преждевременному стираю ключей, так как создаваемые ими объекты собирают мусор.

В первоначальном выпуске платформа .NET Framework 4.8 появилась ошибка, из-за которой X509Certificate2Collection.Import не применял маркер удаления, даже если не были указаны ни PersistKeySet, ни EphemeralKeySet. .NET выпустила исправление этой ошибки в накопительном пакете безопасности и качества за январь 2021 г., чтобы предотвратить непреднамеренное накопление файлов закрытых ключей.  Вызывающие лица, затронутые этим исправлением, могут указать флаг PersistKeySet для возврата к (непреднамеренно отличающейся) платформа .NET Framework поведению RTM версии 4.8, хотя это приведет к накоплению файлов, которое необходимо решить с помощью пользовательской логики очистки.

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.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.