Сукупний пакет оновлень за листопад 2020 р. (підготовча версія для Windows 10 версії 2004 та нижче), а також випуск зведення щодо системи безпеки та якості роботи за січень 2021 р. для .NET Framework 4.8 випустили зміни, щоб покращити процес очищення для сертифікатів X509Certificate2. Нижче наведено додаткові роз'яснення щодо терміну служби приватного ключа у Windows.

З 2.0 .NET Framework існує два різні способи завантаження сертифіката та пов'язаного з ним закритого ключа з файлу PKCS#12 PFX: як один об'єкт сертифіката через учасників класу X509Certificate2 або як усі сертифікати, наявні в PFX за допомогою методів X509Certificate2Collection.Import.

Поведінка за замовчуванням полягає в тому, що закритий ключ завантажується в збережений (іменований) ключ через одну з бібліотек системної криптографії, яка опосередковано записує файл на диск.  Більшість абонентів, які завантажують PFX, тимчасово використовують лише об'єкт сертифіката, тому, коли .NET випускає власні ресурси, пов'язані з сертифікатом, він також видаляє закритий ключ.  Основні винятки з цієї поведінки

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

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

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

По-різному, два різні способи завантаження сертифікатів завжди використовували різні механізми для відстеження, коли це відповідний час, щоб видалити закритий ключ.  Під час завантаження одного сертифіката за допомогою класу 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.

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.