Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA5403 |
| Заголовок | Не используйте жестко заданный сертификат |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Параметр 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");
}
}