CA5403: Certifikát pevně nezakódujte

Vlastnost Hodnota
ID pravidla CA5403
Název Nepoužívejte pevně zakódovaný certifikát
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Parametr data nebo rawData konstruktoru X509Certificate nebo X509Certificate2 je pevně zakódován jedním z následujících způsobů:

Popis pravidla

Privátní klíč pevně zakódovaného certifikátu se snadno zjistí. I s kompilovanými binárními soubory je pro uživatele se zlými úmysly snadné extrahovat privátní klíč pevně zakódovaného certifikátu. Jakmile dojde k ohrožení zabezpečení privátního klíče, může útočník zosobnit tento certifikát a všechny prostředky nebo operace chráněné tímto certifikátem budou útočníkovi k dispozici.

Jak opravit porušení

  • Zvažte návrh aplikace tak, aby používala zabezpečený systém správy klíčů, jako je Azure Key Vault.
  • Udržujte přihlašovací údaje a certifikáty v zabezpečeném umístění odděleně od zdrojového kódu.

Kdy potlačit upozornění

Pokud pevně zakódovaná data neobsahují privátní klíč certifikátu, je bezpečné potlačit upozornění z tohoto pravidla. Například data pocházejí ze .cer souboru. Informace o veřejných certifikátech s pevným kódováním můžou při vypršení platnosti nebo odvolání stále způsobit výzvu pro rotace certifikátů.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Pevně zakódované bajtové pole

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

Pevně zakódované pomocí pole znaků

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

Pevně zakódované pomocí 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);
    }
}

Pevně zakódované pomocí 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);
    }
}

Řešení

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

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