CA5403: Não codificar certificado

Propriedade valor
ID da regra CA5403
Cargo Não codificar certificado
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

O data parâmetro ou de um construtor ou rawDataX509Certificate2 é codificado por um X509Certificate dos seguintes:

Descrição da regra

A chave privada de um certificado codificado é facilmente descoberta. Mesmo com binários compilados, é fácil para usuários mal-intencionados extrair a chave privada de um certificado codificado. Depois que a chave privada for comprometida, um invasor poderá se passar por esse certificado, e quaisquer recursos ou operações protegidos por esse certificado estarão disponíveis para o invasor.

Como corrigir violações

  • Considere reprojetar seu aplicativo para usar um sistema de gerenciamento de chaves seguro, como o Azure Key Vault.
  • Mantenha as credenciais e os certificados em um local seguro separado do código-fonte.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se os dados codificados não contiverem a chave privada do certificado. Por exemplo, os dados são de um .cer arquivo. A codificação de informações de certificados públicos ainda pode criar um desafio para a rotação de certificados à medida que expiram ou são revogados.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

#pragma warning disable CA5403
// The code that's violating the rule is on this line.
#pragma warning restore CA5403

Para desabilitar a regra para um arquivo, pasta ou projeto, defina sua severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA5403.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Codificado por matriz de bytes

using System.IO;
using System.Security.Cryptography.X509Certificates;

class ExampleClass
{
    public void ExampleMethod(string path)
    {
        byte[] bytes = new byte[] {1, 2, 3};
        File.WriteAllBytes(path, bytes);
        new X509Certificate2(path);
    }
}

Codificado por matriz char

using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;

class ExampleClass
{
    public void ExampleMethod(byte[] bytes, string path)
    {
        char[] chars = new char[] { '1', '2', '3' };
        Encoding.ASCII.GetBytes(chars, 0, 3, bytes, 0);
        File.WriteAllBytes(path, bytes);
        new X509Certificate2(path);
    }
}

Codificado por FromBase64String

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

class ExampleClass
{
    public void ExampleMethod(string path)
    {
        byte[] bytes = Convert.FromBase64String("AAAAAaazaoensuth");
        File.WriteAllBytes(path, bytes);
        new X509Certificate2(path);
    }
}

Codificado por GetBytes

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;

class ExampleClass
{
    public void ExampleMethod(string path)
    {
        byte[] bytes = Encoding.ASCII.GetBytes("AAAAAaazaoensuth");
        File.WriteAllBytes(path, bytes);
        new X509Certificate2(path);
    }
}

Solução

using System.IO;
using System.Security.Cryptography.X509Certificates;

class ExampleClass
{
    public void ExampleMethod(string path)
    {
        new X509Certificate2("Certificate.cer");
    }
}