次の方法で共有


CA5403:証明書をハードコーディングしない

プロパティ
ルール ID CA5403
Title 証明書をハードコーディングしない
[カテゴリ] Security
修正が中断か中断なしであるか なし
.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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

疑似コードの例

byte 配列によるハードコーディング

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