Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Если рабочая нагрузка загружает PKCS#12/PFX в Windows без настройки PersistKeySet параметров хранения, EphemeralKeySet .NET определяет, когда закрытый ключ больше не нужен и должен быть удален. В предыдущих версиях .NET (и в платформа .NET Framework) использовались два разных набора логики. В .NET 9 существует один набор логики.
Прежнее поведение
Ранее при загрузке сертификата (и его закрытого ключа) из PKCS#12/PFX new X509Certificate2(pfx, password, flags)загруженный сертификат представлял время существования закрытого ключа. Когда этот объект сертификата был удален (или завершен, если он был собран мусором без удаления), связанный закрытый ключ был удален. Нет общего владения или передачи собственности.
При загрузке сертификата (и его закрытого ключа) из PKCS#12/PFX X509Certificate2Collection.Import(pfx, password, flags)каждый загруженный сертификат с закрытым ключом отслеживал время существования, как и при загрузке одного сертификата. Но, кроме того, маркер был помещен на собственную копию сертификата, чтобы указать, что все копии также должны отслеживать время существования закрытого ключа. Если второй X509Certificate2 объект был создан с точки зрения того же базового PCERT_CONTEXT значения, то независимо от того, какая копия была удалена (или завершена) сначала стерла закрытый ключ из-под другой копии.
Сбой следующего кода (с a CryptographicException или a NullReferenceException) из-за удаления закрытого ключа:
X509Certificate2Collection coll = new X509Certificate2Collection(pfx, password, X509KeyStorageFlags.DefaultKeySet);
X509Certificate2Collection coll2 = coll.Find(X509FindType.FindBySubjectName, "", false);
coll2 = null;
GC.Collect();
GC.WaitForPendingFinalizers();
using (RSA key = coll[0].GetRSAPrivateKey())
{
key.SignData(pfx, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
}
Новое поведение
Начиная с .NET 9 время существования всегда связано с экземпляром X509Certificate2 , который был создан непосредственно из загрузки PKCS#12/PFX.
Тот же фрагмент кода в разделе "Предыдущее поведение " теперь успешно выполнен.
Представленные версии
.NET 9( предварительная версия 7)
Тип критического изменения
Причина изменения
Большинство рабочих нагрузок, загружающих PKCS#12/PFX, используют одну загрузку сертификатов и понимают механику времени существования, связанную с этим методом. Механика, связанная с нагрузкой коллекции, часто была удивительной, а иногда приводит к преждевременной стирке ключей.
Рекомендуемое действие
Если вы поняли управление временем существования нагрузки коллекции и зависело от вызова Dispose клона, чтобы вызвать стирание ключей, убедитесь, что вы также (или вместо этого) вызываете Dispose исходный загруженный объект.