Share via


CA5403: 인증서를 하드 코딩하지 마세요.

속성
규칙 ID CA5403
타이틀 인증서 하드 코딩 안 함
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

X509Certificate 또는 X509Certificate2 생성자의 data 또는 rawData 매개 변수가 다음 중 하나에 의해 하드 코드됩니다.

규칙 설명

하드 코드된 인증서의 프라이빗 키는 쉽게 검색됩니다. 컴파일된 이진 파일인 경우에도 악의적인 사용자가 하드 코드된 인증서의 프라이빗 키를 쉽게 추출할 수 있습니다. 프라이빗 키가 손상되면 공격자가 해당 인증서를 가장할 수 있으며 해당 인증서로 보호되는 모든 리소스나 작업을 공격자가 사용할 수 있습니다.

위반 문제를 해결하는 방법

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