CA5403: Non impostare un certificato hardcoded

Proprietà valore
ID regola CA5403
Titolo Non impostare il certificato come hardcoded
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Il data parametro o di un X509Certificate costruttore o rawDataX509Certificate2 è hardcoded da uno dei seguenti elementi:

Descrizione regola

La chiave privata di un certificato hardcoded è facilmente individuata. Anche con i file binari compilati, è facile per gli utenti malintenzionati estrarre la chiave privata di un certificato hardcoded. Una volta compromessa la chiave privata, un utente malintenzionato può rappresentare tale certificato e tutte le risorse o le operazioni protette da tale certificato saranno disponibili per l'utente malintenzionato.

Come correggere le violazioni

  • Prendere in considerazione la riprogettazione dell'applicazione per l'uso di un sistema di gestione delle chiavi sicuro, ad esempio Azure Key Vault.
  • Mantenere le credenziali e i certificati in una posizione sicura separata dal codice sorgente.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se i dati hardcoded non contengono la chiave privata del certificato. Ad esempio, i dati provengono da un .cer file. Le informazioni sul certificato pubblico hardcoded possono comunque creare una sfida per la rotazione dei certificati quando scadono o vengono revocate.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempi di pseudo-codice

Matrice di byte hardcoded byte

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);
    }
}

Hardcoded by char array

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);
    }
}

Hardcoded by 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);
    }
}

Hardcoded by 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);
    }
}

Soluzione

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

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