セキュリティの C# コンパイラ オプション

以下のオプションは、コンパイラのセキュリティ オプションを制御します。 新しい MSBuild 構文は、太字で示されています。 以前の csc.exe 構文は、code style で示されています。

  • PublicSign / -publicsign: アセンブリに公開署名します。
  • DelaySign / -delaysign: 厳密な名前のキーのパブリックな部分のみを使ってアセンブリに遅延署名します。
  • KeyFile / -keyfile: 厳密な名前のキー ファイルを指定します。
  • KeyContainer / -keycontainer: 厳密な名前のキー コンテナーを指定します。
  • HighEntropyVA / -highentropyva: 高エントロピ Address Space Layout Randomization (ASLR) を有効にします。

PublicSign

このオプションを指定すると、コンパイラは公開キーを適用しますが、実際にはアセンブリに署名しません。 PublicSign オプションは、ファイルが署名されていることをランタイムに伝えるアセンブリのビットも設定します。

<PublicSign>true</PublicSign>

PublicSign オプションを使用するには、KeyFile オプションまたは KeyContainer オプションを使用する必要があります。 KeyFileKeyContainer オプションは、公開キーを指定します。 PublicSign オプションと DelaySign オプションは相互に排他的です。 "フェイク署名" または "OSS 署名" と呼ばれることもあり、公開署名には出力アセンブリ内の公開キーが含まれ、"署名済み" フラグが設定されます。 公開署名では、実際には秘密キーによるアセンブリの署名は行われません。 開発者は、オープンソース プロジェクトに公開署名を使用します。 ユーザーは、アセンブリの署名に使用された秘密キーにアクセスできない場合、リリースされている "完全に署名された" アセンブリと互換性を持つアセンブリをビルドします。 アセンブリが完全に署名されているかどうかをコンシューマーが実際に確認する必要があることはほとんどないので、このようなパブリックにビルドされたアセンブリは、完全に署名されたアセンブリが使用されるほとんどすべてのシナリオにおいて使用可能です。

DelaySign

このオプションを使用すると、出力ファイルに署名用のスペースが予約され、デジタル署名を後で追加できるようになります。

<DelaySign>true</DelaySign>

完全署名されたアセンブリを作成する場合は、DelaySign- を使用します。 アセンブリに公開キーだけを含める場合は、DelaySign を使用します。 DelaySign オプションは、KeyFile または KeyContainer と共に使用しない場合、無効になります。 KeyContainer オプションと PublicSign オプションは同時に指定できません。 アセンブリに完全に署名するように指定すると、コンパイラはマニフェスト (アセンブリ メタデータ) を含むファイルをハッシュし、秘密キーでそのハッシュに署名します。 その処理により、マニフェストを含むファイルに格納されるデジタル署名が作成されます。 アセンブリを遅延署名に設定すると、コンパイラは署名の計算も格納も行いません。 代わりに、後で署名を追加できるようにファイルに領域を確保します。

DelaySign を指定すると、テスト時にはアセンブリをグローバル キャッシュに格納できます。 テスト後に、アセンブリ リンカー ユーティリティを使用してアセンブリに秘密キーを配置することにより、そのアセンブリに完全署名できます。 詳しくは、「厳密な名前付きアセンブリの作成と使用」および「アセンブリへの遅延署名」をご覧ください。

KeyFile

暗号化キーを格納するファイル名を指定します。

<KeyFile>filename</KeyFile>

file は、厳密な名前のキーを格納するファイルの名前です。 このオプションを指定すると、コンパイラは、指定したファイルからアセンブリ マニフェストに公開キーを挿入し、最終的なアセンブリに秘密キーで署名します。 キー ファイルを生成するには、コマンド ラインで「sn -k file」と入力します。 -target:module を指定してコンパイルした場合は、キー ファイルの名前がモジュールに保持され、AddModules でアセンブリをコンパイルすると作成されるアセンブリに組み込まれます。 また、暗号化情報を KeyContainer でコンパイラに渡すことができます。 部分的に署名されたアセンブリを作成する場合は、DelaySign を使用します。 同じコンパイルで KeyFileKeyContainer を両方とも指定すると、コンパイラは最初にキー コンテナーを試します。 それが成功すると、アセンブリはキー コンテナーの情報で署名されます。 キー コンテナーが見つからない場合、コンパイラは KeyFile で指定されたファイルを検索します。 ファイルが検出された場合、アセンブリはキー ファイルの情報で署名され、キー情報はキー コンテナーにインストールされます。 次のコンパイル時にはキー コンテナーが有効になります。 キー ファイルには公開キーだけが含まれる場合があります。 詳しくは、「厳密な名前付きアセンブリの作成と使用」および「アセンブリへの遅延署名」をご覧ください。

KeyContainer

暗号化キー コンテナーの名前を指定します。

<KeyContainer>container</KeyContainer>

container は、厳密な名前のキー コンテナーの名前です。 KeyContainer オプションを使用すると、コンパイラは共有可能なコンポーネントを作成します。 コンパイラは、指定されたコンテナーからアセンブリ マニフェストに公開キーを挿入し、最終的なアセンブリに秘密キーで署名します。 キー ファイルを生成するには、コマンド ラインで「sn -k file」と入力します。 sn -i は、キー ペアをコンテナーにインストールします。 コンパイラが CoreCLR 上で実行するときは、このオプションはサポートされません。 CoreCLR 上でビルドするときにアセンブリに署名するには、KeyFile オプションを使用します。 TargetType を指定してコンパイルした場合は、キー ファイルの名前がモジュールに保持され、このモジュールを AddModules でアセンブリにコンパイルするときに、アセンブリに組み込まれます。 このオプションは、任意の Microsoft Intermediate Language (MSIL) モジュールのソース コードで、カスタム属性 (System.Reflection.AssemblyKeyNameAttribute) として指定することもできます。 また、暗号化情報を KeyFile でコンパイラに渡すことができます。 公開キーをアセンブリ マニフェストに追加し、アセンブリの署名はテスト後まで待ってから行う場合は、DelaySign を使用します。 詳しくは、「厳密な名前付きアセンブリの作成と使用」および「アセンブリへの遅延署名」をご覧ください。

HighEntropyVA

HighEntropyVA コンパイラ オプションは、特定の実行可能ファイルで高エントロピ Address Space Layout Randomization (ASLR) をサポートするかどうかを Windows カーネルに示します。

<HighEntropyVA>true</HighEntropyVA>

このオプションは、64 ビットの実行可能ファイルまたは PlatformTarget コンパイラ オプションによって示される実行可能ファイルで、高エントロピ仮想アドレス空間をサポートすることを指定します。 このオプションは、すべての .NET Standard と .NET Core バージョン、.NET Framework 4.5 以降の.NET Framework バージョンに対して既定で有効になっています。

HighEntropyVA オプションを指定すると、適合するバージョンの Windows カーネルで、ASLR の一環としてプロセスのアドレス空間レイアウトをランダム化する際、より高いエントロピを使用できるようになります。 より高いエントロピを使用するということは、スタックやヒープといったメモリ領域に割り当てることのできるアドレス数が増えることを意味します。 これによって特定のメモリ領域の位置を推測しづらくなる効果が得られます。 HighEntropyVA コンパイラ オプションには、ターゲット実行可能ファイルが必要であり、これが依存するすべてのモジュールは 64 ビット プロセスとして動作する際に 4 ギガバイト (GB) を超えるポインター値を処理できます。