CA5403: не удостоверяйте сертификат жесткого кода

Свойство Значение
Идентификатор правила CA5403
Заголовок Не используйте жестко заданный сертификат
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Параметр data или rawData конструктора X509Certificate или X509Certificate2 жестко задается одним из следующих элементов.

Описание правила

Закрытый ключ жестко заданного сертификата легко обнаружить. Даже при использовании скомпилированных двоичных файлов злоумышленники могут легко извлечь закрытый ключ жестко заданного сертификата. После компрометации закрытого ключа злоумышленник может олицетворить этот сертификат, и все ресурсы или операции, защищенные этим сертификатом, станут доступны злоумышленнику.

Устранение нарушений

  • Рекомендуется переработать приложение, так чтобы оно использовало безопасную систему управления ключами, например Azure Key Vault.
  • Храните учетные данные и ключи в безопасном месте отдельно от исходного кода.

Когда лучше отключить предупреждения

Вы можете безопасно отключить предупреждение из этого правила, если жестко заданные данные не содержат закрытый ключ сертификата. Как, например, данные из файла .cer. Жестко заданные сведения общедоступного сертификата могут по-прежнему создавать запрос на смену сертификатов по мере их истечения или отзыва.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Примеры псевдокода

Жесткое задание в массиве байтов

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

Жесткое задание в массиве символов

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

Жесткое задание в 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);
    }
}

Жесткое задание в 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);
    }
}

Решение

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

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