Durée de vie simplifiée de la clé privée Windows
Lorsqu’une charge de travail charge un PKCS#12/PFX sur Windows sans définir les options de stockage PersistKeySet ou EphemeralKeySet, .NET détermine quand la clé privée n’est plus nécessaire et doit être effacée.. Dans les versions précédentes de .NET (et dans .NET Framework), deux ensembles de logiques différents ont été utilisés. Dans .NET 9, il existe un seul ensemble de logiques.
Comportement précédent
Auparavant, lors du chargement d’un certificat (et de sa clé privée) à partir d’un PKCS#12/PFX avec new X509Certificate2(pfx, password, flags)
, le certificat chargé représentait la durée de vie de la clé privée. Lorsque cet objet de certificat était éliminé (ou avait pris fin s’il avait été récupéré par le Garbage Collector sans être supprimé), la clé privée associée était supprimée. Aucune propriété partagée ni transfert de propriété n’avait lieu.
Lors du chargement d’un certificat (et de sa clé privée) à partir d’un PKCS#12/PFX avec X509Certificate2Collection.Import(pfx, password, flags)
, chaque certificat chargé ayant une clé privée a effectué le suivi de la durée de vie, comme avec la charge de certificat unique. En outre, un marqueur a été placé sur la copie native du certificat pour indiquer que toutes les copies doivent également suivre la durée de vie de la clé privée. Si un deuxième objet X509Certificate2 a été créé en termes de même valeur sous-jacente PCERT_CONTEXT
, la copie supprimée (ou ayant pris fin) a d’abord effacé la clé privée de l’autre copie.
Le code suivant a échoué (soit avec un CryptographicException, soit un NullReferenceException) car la clé privée a été supprimée :
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);
}
Nouveau comportement
À compter de .NET 9, la durée de vie est toujours associée à l’instance X509Certificate2 qui a été produite directement à partir de la charge PKCS#12/PFX.
Le même extrait de code dans la section Précédent comportement est produit désormais des résultats fructueux.
Version introduite
.NET 9 Préversion 7
Type de changement cassant
Ce changement est un changement de comportement.
Raison du changement
La plupart des charges de travail qui chargent un PKCS#12/PFX utilisent la charge de certificat unique et interprètent les mécanismes de durée de vie associés à cette méthode. Les mécanismes associés à la charge de collecte étaient souvent surprenants, et ont parfois conduit à la suppression prématurée des clés.
Action recommandée
Si vous avez compris la gestion de la durée de vie de chargement de collection et que vous dépendiez de l’appel Dispose
au niveau d’un clone pour provoquer la suppression de la clé, assurez-vous que vous appelez également (ou à la place) Dispose
au niveau de l’objet chargé d’origine.