Condividi tramite


CA5403: Non hardcodificare i certificati

Proprietà valore
ID regola CA5403
Title Non incorporare il certificato nel codice.
Categoria Sicurezza
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 No
Linguaggi applicabili C# e Visual Basic

Causa

Il parametro data o rawData di un costruttore X509Certificate o X509Certificate2 è codificato in modo fisso 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 attaccante può fingersi quel certificato e tutte le risorse e operazioni protette da tale certificato saranno disponibili per l'attaccante.

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 rappresentare una sfida per la rotazione dei certificati quando scadono o vengono revocati.

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 codificato in modo fisso

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

Codificato staticamente tramite un array di caratteri

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

Codificato in modo rigido da 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);
    }
}

Codificato fisso da 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");
    }
}