Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Když úloha načte PKCS#12/PFX ve Windows bez nastavení PersistKeySet možností úložiště nebo EphemeralKeySet možnosti úložiště, .NET určí, kdy už není privátní klíč potřeba a má být vymazán. V předchozích verzích .NET (a v rozhraní .NET Framework) byly použity dvě různé sady logiky. V .NET 9 existuje jedna sada logiky.
Předchozí chování
Dříve při načítání certifikátu (a jeho privátního klíče) z PKCS#12/PFX s new X509Certificate2(pfx, password, flags)
načteným certifikátem představoval životnost privátního klíče. Když byl tento objekt certifikátu odstraněn (nebo finalizován, pokud byl uvolněn bez uvolnění paměti), přidružený privátní klíč byl odstraněn. Nedošlo k žádnému sdílenému vlastnictví ani převodu vlastnictví.
Při načítání certifikátu (a jeho privátního klíče) z PKCS#12/PFX s každým načteným certifikátem X509Certificate2Collection.Import(pfx, password, flags)
, který měl privátní klíč, sledoval životnost stejně jako načtení jednoho certifikátu. Kromě toho byla značka umístěna na nativní kopii certifikátu, která indikuje, že všechny kopie by měly také sledovat životnost privátního klíče. Pokud byl druhý X509Certificate2 objekt vytvořen z hlediska stejné podkladové PCERT_CONTEXT
hodnoty, pak podle toho, která kopie byla odstraněna (nebo finalizována), nejprve vymaže privátní klíč z druhé kopie.
Následující kód selhal (buď s kódem CryptographicException nebo a NullReferenceException), protože byl odstraněn privátní klíč:
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);
}
Nové chování
Od verze .NET 9 je životnost vždy přidružená k X509Certificate2 instanci, která byla vytvořena přímo z načtení PKCS#12/PFX.
Stejný fragment kódu v předchozí části chování je nyní úspěšný.
Zavedená verze
.NET 9 Preview 7
Typ zásadní změny
Tato změna je změna chování.
Důvod změny
Většina úloh, které načítají PKCS#12/PFX, používá jedno načtení certifikátu a rozumí mechanismy životnosti přidružené k této metodě. Mechanika spojená s zatížením kolekce byla často překvapivá a někdy vedla k předčasnému vymazání klíče.
Doporučená akce
Pokud jste porozuměli správě životnosti načítání kolekce a záviseli na volání Dispose
klonu, aby způsobilo vymazání klíče, ujistěte se, že také (nebo místo toho) voláte Dispose
na původní načtený objekt.