CA5403: не удостоверяйте сертификат жесткого кода
Свойство | Значение |
---|---|
Идентификатор правила | CA5403 |
Заголовок | Не используйте жестко заданный сертификат |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Параметр data
или rawData
конструктора X509Certificate или X509Certificate2 жестко задается одним из следующих элементов.
- Массив байтов.
- Массив символов.
- System.Convert.FromBase64String(String).
- Все перегрузки метода System.Text.Encoding.GetBytes.
Описание правила
Закрытый ключ жестко заданного сертификата легко обнаружить. Даже при использовании скомпилированных двоичных файлов злоумышленники могут легко извлечь закрытый ключ жестко заданного сертификата. После компрометации закрытого ключа злоумышленник может олицетворить этот сертификат, и все ресурсы или операции, защищенные этим сертификатом, станут доступны злоумышленнику.
Устранение нарушений
- Рекомендуется переработать приложение, так чтобы оно использовало безопасную систему управления ключами, например 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");
}
}