Sdílet prostřednictvím


Zjednodušená životnost privátního klíče Windows

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.

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.

Ovlivněná rozhraní API