CA5403: Nie należy kodzie certyfikatu

Właściwości Wartość
Identyfikator reguły CA5403
Stanowisko Nie zapisuj certyfikatu na stałe w kodzie
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Parametr dataX509CertificateX509Certificate2 lub rawData konstruktora jest zakodowany w sposób twardy przez jedną z następujących metod:

Opis reguły

Klucz prywatny certyfikatu zakodowanego jest łatwo wykrywany. Nawet w przypadku skompilowanych plików binarnych złośliwi użytkownicy mogą łatwo wyodrębnić zakodowany klucz prywatny certyfikatu. Po naruszeniu zabezpieczeń klucza prywatnego osoba atakująca może personifikować ten certyfikat, a wszystkie zasoby lub operacje chronione przez ten certyfikat będą dostępne dla osoby atakującej.

Jak naprawić naruszenia

  • Rozważ przeprojektowanie aplikacji w celu użycia bezpiecznego systemu zarządzania kluczami, takiego jak usługa Azure Key Vault.
  • Zachowaj poświadczenia i certyfikaty w bezpiecznej lokalizacji niezależnie od kodu źródłowego.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli zakodowane dane nie zawierają klucza prywatnego certyfikatu. Na przykład dane pochodzą z .cer pliku. Trwałe kodowanie informacji o certyfikacie publicznym może nadal stwarzać wyzwanie dla rotacji certyfikatów w miarę ich wygasania lub odwoływania.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady przykładów kodu przykładowego

Zakodowana na sztywno tablica bajtów

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

Zakodowane na podstawie tablicy znaków

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

Zakodowane na podstawie metody 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);
    }
}

Zakodowane na podstawie metody 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);
    }
}

Rozwiązanie

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

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