Uproszczony okres istnienia klucza prywatnego systemu Windows
Gdy obciążenie ładuje PKCS#12/PFX w systemie Windows bez ustawiania PersistKeySet opcji magazynu lub EphemeralKeySet , platforma .NET określa, kiedy klucz prywatny nie jest już potrzebny i powinien zostać wymazany. W poprzednich wersjach platformy .NET (i w programie .NET Framework) użyto dwóch różnych zestawów logiki. Na platformie .NET 9 istnieje jeden zestaw logiki.
Poprzednie zachowanie
Wcześniej podczas ładowania certyfikatu (i jego klucza prywatnego) z PKCS#12/PFX z załadowanym certyfikatem new X509Certificate2(pfx, password, flags)
reprezentował okres istnienia klucza prywatnego. Gdy ten obiekt certyfikatu został usunięty (lub sfinalizowany, jeśli został usunięty bez usuwania pamięci), skojarzony klucz prywatny został usunięty. Nie nastąpiła własność współdzielona ani przeniesienie własności.
Podczas ładowania certyfikatu (i jego klucza prywatnego) z PKCS#12/PFX za pomocą X509Certificate2Collection.Import(pfx, password, flags)
programu każdy załadowany certyfikat, który miał klucz prywatny śledzony okres istnienia, podobnie jak w przypadku obciążenia pojedynczego certyfikatu. Ponadto znacznik został umieszczony na natywnej kopii certyfikatu, aby wskazać, że wszystkie kopie powinny również śledzić okres istnienia klucza prywatnego. Jeśli drugi X509Certificate2 obiekt został utworzony pod względem tej samej wartości bazowej PCERT_CONTEXT
, niezależnie od tego, która kopia została usunięta (lub sfinalizowana) najpierw wymazała klucz prywatny z innej kopii.
Następujący kod nie powiódł się (z elementem CryptographicException lub ), NullReferenceExceptionponieważ klucz prywatny został usunięty:
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);
}
Nowe zachowanie
Począwszy od platformy .NET 9, okres istnienia jest zawsze skojarzony z X509Certificate2 wystąpieniem, które zostało bezpośrednio wygenerowane z obciążenia PKCS#12/PFX.
Ten sam fragment kodu w poprzedniej sekcji zachowania zakończy się teraz powodzeniem.
Wprowadzona wersja
.NET 9 (wersja zapoznawcza 7)
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
Większość obciążeń, które ładują PKCS#12/PFX, używają obciążenia pojedynczego certyfikatu i rozumieją mechanikę okresu istnienia skojarzona z tą metodą. Mechanika związana z obciążeniem kolekcji często była zaskakująca, a czasami prowadzi do przedwczesnego wymazywania kluczy.
Zalecana akcja
Jeśli rozumiesz zarządzanie okresem istnienia ładowania kolekcji i polegasz na wywołaniu Dispose
klonu, aby spowodować wymazywanie klucza, upewnij się, że również (lub zamiast tego) wywołujesz Dispose
oryginalny załadowany obiekt.