Delen via


Levensduur van persoonlijke Windows-sleutel vereenvoudigd

Wanneer een workload een PKCS#12/PFX in Windows laadt zonder de PersistKeySet opties of EphemeralKeySet opslagopties in te stellen, bepaalt .NET wanneer de persoonlijke sleutel niet meer nodig is en moet worden gewist. In eerdere versies van .NET (en in .NET Framework) werden twee verschillende sets logica gebruikt. In .NET 9 is er één set logica.

Vorig gedrag

Voorheen, bij het laden van een certificaat (en de bijbehorende persoonlijke sleutel) van een PKCS#12/PFX met new X509Certificate2(pfx, password, flags), vertegenwoordigde het geladen certificaat de levensduur van de persoonlijke sleutel. Toen dit certificaatobject werd verwijderd (of voltooid als het afval werd verzameld zonder te worden verwijderd), is de bijbehorende persoonlijke sleutel verwijderd. Er is geen gedeeld eigendom of overdracht van eigendom opgetreden.

Bij het laden van een certificaat (en de bijbehorende persoonlijke sleutel) van een PKCS#12/PFX met X509Certificate2Collection.Import(pfx, password, flags), heeft elk geladen certificaat met een persoonlijke sleutel de levensduur bijgehouden, net als bij de belasting van één certificaat. Daarnaast is er een markering op de systeemeigen kopie van het certificaat geplaatst om aan te geven dat kopieën ook de levensduur van de persoonlijke sleutel moeten bijhouden. Als er een tweede X509Certificate2 object is gemaakt in termen van dezelfde onderliggende PCERT_CONTEXT waarde, wist de persoonlijke sleutel eerst uit onder de andere kopie, afhankelijk van welke kopie is verwijderd (of voltooid).

De volgende code is mislukt (met een CryptographicException of a NullReferenceException) omdat de persoonlijke sleutel is verwijderd:

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);
}

Nieuw gedrag

Vanaf .NET 9 is de levensduur altijd gekoppeld aan het X509Certificate2 exemplaar dat rechtstreeks is geproduceerd vanuit de PKCS#12/PFX-belasting.

Hetzelfde codefragment in de sectie Vorig gedrag slaagt nu.

Versie geïntroduceerd

.NET 9 Preview 7

Type wijziging die fouten veroorzaken

Deze wijziging is een gedragswijziging.

Reden voor wijziging

De meeste workloads die een PKCS#12/PFX laden, gebruiken de belasting van één certificaat en begrijpen de levensduurmechanica die aan die methode is gekoppeld. De mechanismen die verband houden met de verzamelingsbelasting waren vaak verrassend en leiden soms tot voortijdige sleutelverwijdering.

Als u het levensduurbeheer voor verzamelingsbelasting begrijpt en afhankelijk bent van het aanroepen van Dispose een kloon om sleutelverwijdering te veroorzaken, moet u ervoor zorgen dat u ook (of in plaats daarvan) het oorspronkelijke geladen object aanroept Dispose .

Betrokken API's