Condividi tramite


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.

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.

API interessate