Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Quando uma carga de trabalho carrega um PKCS#12/PFX no Windows sem definir as opções de armazenamento, PersistKeySet o EphemeralKeySet .NET determina quando a chave privada não é mais necessária e deve ser excluída. Nas versões anteriores do .NET (e no .NET Framework), eram usados dois conjuntos diferentes de lógica. No .NET 9, há um único conjunto de lógica.
Comportamento anterior
Anteriormente, ao carregar um certificado (e sua chave privada) de um PKCS#12/PFX com new X509Certificate2(pfx, password, flags), o certificado carregado representava o tempo de vida da chave privada. Quando este objeto de certificado foi descartado (ou finalizado, caso tenha sido coletado da lixeira sem ser descartado), a chave privada associada foi excluída. Não houve propriedade compartilhada ou transferência de propriedade.
Ao carregar um certificado (e sua chave privada) de um PKCS#12/PFX com X509Certificate2Collection.Import(pfx, password, flags), cada certificado carregado que tinha uma chave privada rastreava o tempo de vida, como no carregamento de um único certificado. Mas, além disso, um marcador foi colocado na cópia nativa do certificado para indicar que todas as cópias também deveriam rastrear o tempo de vida da chave privada. Se um segundo X509Certificate2 objeto foi criado em termos do mesmo valor fundamental, PCERT_CONTEXT então a cópia descartada (ou finalizada) primeiro apagou a chave privada da outra cópia.
O código a seguir falhou (com a CryptographicException ou a NullReferenceException) porque a chave privada foi excluída:
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);
}
Novo comportamento
A partir do .NET 9, o tempo de vida está sempre associado à X509Certificate2 instância produzida diretamente a partir do carregamento do PKCS#12/PFX.
O mesmo snippet de código na seção Comportamento anterior agora é bem-sucedido.
Versão introduzida
.NET 9 versão prévia 7
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
A maioria das cargas de trabalho que carregam um PKCS#12/PFX usa o carregamento de certificado único e entende a mecânica do tempo de vida associada a esse método. A mecânica associada à carga de coleta era frequentemente surpreendente e, às vezes, levava ao apagamento prematuro da chave.
Ação recomendada
Se você entendeu o gerenciamento do tempo de vida do carregamento de coleta e dependeu da chamada Dispose de um clone para causar o apagamento da chave, verifique se você também está (ou em vez disso) chamando Dispose o objeto carregado original.