Бөлісу құралы:


CA5403: Не хардкодируйте сертификаты

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

Причина

Параметр 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");
    }
}