Share via


CA5403: Hårdkoda inte certifikat

Property Värde
Regel-ID CA5403
Rubrik Hårdkoda inte certifikat
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Parametern data eller rawData för en X509Certificate konstruktor X509Certificate2 är hårdkodad av något av följande:

Regelbeskrivning

Det är enkelt att identifiera ett hårdkodat certifikats privata nyckel. Även med kompilerade binärfiler är det enkelt för skadliga användare att extrahera ett hårdkodat certifikats privata nyckel. När den privata nyckeln har komprometterats kan en angripare personifiera certifikatet och alla resurser eller åtgärder som skyddas av certifikatet blir tillgängliga för angriparen.

Så här åtgärdar du överträdelser

  • Överväg att göra om ditt program så att det använder ett säkert nyckelhanteringssystem, till exempel Azure Key Vault.
  • Behåll autentiseringsuppgifter och certifikat på en säker plats separat från källkoden.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om hårdkodade data inte innehåller certifikatets privata nyckel. Data kommer till exempel från en .cer fil. Hårdkodad offentlig certifikatinformation kan fortfarande skapa en utmaning för roterande certifikat när de upphör att gälla eller återkallas.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel på pseudokod

Hårdkodad efter bytematris

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

Hårdkodad efter teckenmatris

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

Hårdkodad av 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);
    }
}

Hårdkodad av 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);
    }
}

Lösning

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

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