Durata semplificata della chiave privata di Windows
Quando un carico di lavoro carica un file PKCS#12/PFX in Windows senza impostare le PersistKeySet opzioni di archiviazione o EphemeralKeySet , .NET determina quando la chiave privata non è più necessaria e deve essere cancellata. Nelle versioni precedenti di .NET (e in .NET Framework) sono stati usati due diversi set di logica. In .NET 9 è presente un singolo set di logica.
Comportamento precedente
In precedenza, quando si carica un certificato (e la relativa chiave privata) da un pkCS#12/PFX con new X509Certificate2(pfx, password, flags)
, il certificato caricato rappresentava la durata della chiave privata. Quando questo oggetto certificato è stato eliminato (o finalizzato se è stato sottoposto a Garbage Collection senza essere eliminato), la chiave privata associata è stata eliminata. Non si è verificato alcun trasferimento di proprietà o proprietà condivisa.
Quando si carica un certificato (e la relativa chiave privata) da un certificato PKCS#12/PFX con X509Certificate2Collection.Import(pfx, password, flags)
, ogni certificato caricato con una chiave privata ha rilevato la durata, come con il caricamento del singolo certificato. Tuttavia, un marcatore è stato inserito nella copia nativa del certificato per indicare che anche le copie devono tenere traccia della durata della chiave privata. Se è stato creato un secondo X509Certificate2 oggetto in termini dello stesso valore sottostante PCERT_CONTEXT
, qualsiasi copia sia stata eliminata (o finalizzata) cancellasse prima la chiave privata dall'altra copia.
Il codice seguente non è riuscito (con o CryptographicException ) NullReferenceExceptionperché la chiave privata è stata eliminata:
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);
}
Nuovo comportamento
A partire da .NET 9, la durata è sempre associata all'istanza X509Certificate2 generata direttamente dal caricamento PKCS#12/PFX.
Lo stesso frammento di codice nella sezione Comportamento precedente ha ora esito positivo.
Versione introdotta
.NET 9 Anteprima 7
Tipo di modifica che causa un'interruzione
Questa è una modifica funzionale.
Motivo della modifica
La maggior parte dei carichi di lavoro che caricano un pkCS#12/PFX usa il carico del singolo certificato e comprende i meccanismi di durata associati a tale metodo. I meccanismi associati al carico di raccolta sono stati spesso sorprendenti e talvolta causano una cancellazione prematura delle chiavi.
Azione consigliata
Se si è compresa la gestione della durata del carico della raccolta e si dipende dalla chiamata Dispose
a un clone per causare la cancellazione delle chiavi, assicurarsi di chiamare Dispose
anche (o invece) sull'oggetto caricato originale.