A Versão prévia de atualização cumulativa de novembro de 2020 para Windows 10 versão 2004 e abaixo, bem como a versão de rollup de segurança e qualidade de janeiro de 2021 para .NET Framework 4.8 lançaram uma alteração para melhorar o processo de limpo para certificados X509Certificate2. Abaixo, fornecemos esclarecimentos adicionais sobre um tempo de vida de chave privada no Windows.

Desde .NET Framework 2.0, houve duas maneiras diferentes de carregar um certificado e sua chave privada associada de um arquivo PKCS#12 PFX: como um objeto de certificado por meio de membros na classe X509Certificate2 ou como todos os certificados presentes no PFX por meio dos métodos X509Certificate2Collection.Import.

O comportamento padrão é que a chave privada é carregada em uma chave persistente (nomeada) por meio de uma das bibliotecas de criptografia do sistema, que grava indiretamente um arquivo em disco.  A maioria dos chamadores que carregam um PFX usa apenas o objeto certificado temporariamente, portanto, quando o .NET está liberando os recursos nativos associados ao certificado, ele também exclui a chave privada.  As exceções main a esse comportamento são

  1. O sinalizador X509KeyStorageFlags.PersistKeySet, que resulta na gravação do arquivo, mas não excluído,

  2. O sinalizador X509KeyStorageFlags.EphemeralKetSet, que resulta no carregamento da chave privada na memória sem nenhum arquivo de suporte,

  3. Término anormal do processo, que pode ocorrer quando a exclusão de chave está pendente.

Contraintuitivamente, as duas maneiras diferentes de carregar certificados sempre usaram mecanismos diferentes para acompanhamento quando é o momento apropriado para excluir a chave privada.  Carregar um único certificado por meio da classe X509Certificate2 usa um marcador que só é visível para o runtime do .NET e se aplica apenas a essa referência de um objeto.  Carregar um PFX via X509Certificate2Collection.Import usa um marcador no objeto de certificado nativo, o que resulta em "responsabilidade de exclusão" sendo compartilhada entre todos os objetos gerenciados que representam o mesmo certificado nativo.  Isso significa que o novo X509Certificate2(otherCert.Handle). Dispose() fará com que o arquivo de chave privada seja apagado durante a chamada para Dispose() se outroCert foi carregado de um PFX via X509Certificate2Collection.Import, mas não se ele foi carregado de um PFX por meio de qualquer membro da classe X509Certificate2.  Algumas partes do .NET criam internamente novos objetos X509Certificate2 gerenciados a partir de identificadores de certificado nativos, como a classe X509Chain e o método X509Certificate2Collection.Find.  Essas partes da estrutura, e todas as partes que as usam direta ou indiretamente, podem resultar em eliminação prematura de chave à medida que os objetos que eles criam obtêm lixo coletado.

Um bug foi introduzido na versão inicial do .NET Framework 4.8 que resultou em X509Certificate2Collection.Import para não aplicar o marcador de exclusão, mesmo que nem PersistKeySet nem EphemeralKeySet tenham sido especificados. O .NET lançou uma correção para esse bug no Rollup de Segurança e Qualidade de janeiro de 2021 para evitar o acúmulo não intencional de arquivos de chaves privadas abandonados.  Os chamadores afetados por essa correção podem especificar o sinalizador PersistKeySet para retornar ao comportamento (involuntariamente diferente) .NET Framework 4.8 RTM, embora isso resulte em acúmulo de arquivos que precisa ser resolvido com lógica de limpeza personalizada.

X509Certificate2Collection.Import no .NET Core para Windows e .NET 5+ para Windows se comporta da mesma forma que .NET Framework 2.0-4.7.2 (e .NET Framework 4.8 com todas as atualizações aplicadas).  A equipe do .NET está considerando mudar para um design aprimorado no .NET 6 (ou versões futuras), mas essa atualização de design não se aplicará a .NET Framework, .NET Core ou .NET 5.

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.