アセンブリへの遅延署名

開発者側が日常的にアクセスしないキー ペアを、組織で厳重に保護できます。 公開キーは多くのユーザーが使用できることもありますが、秘密キーにアクセスできるユーザーはごくわずかです。 厳密な名前付きのアセンブリを開発する場合、厳密な名前付きの対象アセンブリを参照する各アセンブリには、対象アセンブリに厳密な名前を付けるために使用された公開キーのトークンを格納します。 そのためには、開発プロセス中に公開キーを使用できる必要があります。

ビルド時に遅延署名または部分署名を使用すると、ポータブル実行可能 (PE) ファイルの領域を厳密な名前の署名のために予約できます。しかし、実際の署名は後の段階 (通常はアセンブリの出荷直前) まで遅れます。

アセンブリに遅延署名する手順の概要を次に示します。

  1. 最終的な署名を行う組織からキー ペアの公開キー部分を取得します。 通常、このキーは .snk ファイル形式です。このファイルは、Windows Software Development Kit (SDK) に用意されている厳密名ツール (Sn.exe) を使用して作成できます。

  2. System.Reflection の 2 つのカスタム属性を使用して、アセンブリのソース コードに注釈を付けます。

    • AssemblyKeyFileAttribute は、公開キーを格納するファイルの名前をパラメーターとしてコンストラクターに渡します。

    • AssemblyDelaySignAttribute は、遅延署名を使用していることを示すために、true をパラメーターとしてコンストラクターに渡します。 たとえば、次のようにします。

      <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
      <Assembly:AssemblyDelaySignAttribute(True)>
      
      [assembly:AssemblyKeyFileAttribute("myKey.snk")]
      [assembly:AssemblyDelaySignAttribute(true)]
      
      [assembly:AssemblyKeyFileAttribute("myKey.snk")];
      [assembly:AssemblyDelaySignAttribute(true)];
      
  3. コンパイラは、公開キーをアセンブリ マニフェストに挿入し、PE ファイル内の領域を完全な厳密な名前の署名のために予約します。 実際の公開キーはアセンブリのビルド中に格納してください。これにより、このアセンブリを参照するほかのアセンブリが、それぞれのアセンブリ参照に格納するキーを取得できるようになります。

  4. アセンブリには有効な厳密な名前の署名がないため、厳密な名前の署名の検証をオフにする必要があります。 検証をオフにするには、厳密名ツールで –Vr オプションを使用します。

    アセンブリ myAssembly.dll の検証をオフにする例を次に示します。

    sn –Vr myAssembly.dll
    
    Caution メモ注意

    -Vr オプションは開発時にだけ使用します。検証省略リストにアセンブリを追加すると、セキュリティ上の脆弱性が生じます。悪意のあるアセンブリは、検証省略リストに追加されたアセンブリの完全限定アセンブリ名 (アセンブリ名、バージョン、カルチャ、および公開キー トークン) を使用することによって、その ID を偽装できます。これによって、悪意のあるアセンブリの検証も省略できます。

    メモメモ

    64 ビット コンピューターで Visual Studio を使用して開発しているときに遅延署名を使用し、[Any CPU] のアセンブリをコンパイルする場合は、-Vr オプションを 2 回適用することが必要な場合があります (Visual Studio では、[Any CPU][プラットフォーム ターゲット] ビルド プロパティの値です。コマンド ラインからコンパイルする場合は、これが既定です)。 コマンド ラインまたは Windows Explorer からアプリケーションを実行するには、Sn.exe (厳密名ツール) の 64 ビット バージョンを使用して、アセンブリに -Vr オプションを適用します。デザイン時にアセンブリを Visual Studio に読み込むには (たとえば、アセンブリに、アプリケーションの他のアセンブリで使用されているコンポーネントが含まれている場合)、32 ビット バージョンの厳密名ツールを使用します。これは、Just-In-Time (JIT) コンパイラが、アセンブリがコマンド ラインから実行される場合にはアセンブリを 64 ビット ネイティブ コードにコンパイルし、アセンブリがデザイン時環境に読み込まれる場合には 32 ビット ネイティブ コードにコンパイルするためです。

  5. その後、通常は出荷の直前に、アセンブリを組織の署名機関に送信し、–R オプション付きで厳密名ツールを使用して、実際の厳密な名前の署名を取得します。

    sgKey.snk キー ペアを使用して厳密な名前でアセンブリ myAssembly.dll に署名する例を次に示します。

    sn -R myAssembly.dll sgKey.snk
    

参照

処理手順

方法 : 公開キーと秘密キーのキー ペアを作成する

参照

Sn.exe (厳密名ツール)

概念

アセンブリの作成

その他の技術情報

アセンブリを使用したプログラミング