CA5403: 인증서를 하드 코딩하지 마세요.
속성 | 값 |
---|---|
규칙 ID | CA5403 |
제목 | 인증서 하드 코딩 안 함 |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
X509Certificate 또는 X509Certificate2 생성자의 data
또는 rawData
매개 변수가 다음 중 하나에 의해 하드 코드됩니다.
- 바이트 배열
- Char 배열
- 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);
}
}
char 배열로 하드 코드됨
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");
}
}
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET