アセンブリへの遅延署名
組織には、開発者が日常的にアクセスできない厳重に保護されたキーのペアがある場合があります。 公開キーは広く使用可能ですが、秘密キーへのアクセスは少数のユーザーに限定されます。 厳密な名前のアセンブリを開発すると、厳密な名前のターゲット アセンブリを参照する各アセンブリに、そのターゲット アセンブリに厳密な名前を指定するために使用する公開キーのトークンが含まれています。 この場合、開発プロセスで、公開キーを使用できる必要があります。
ビルド時に遅延署名または部分署名を使用することで、厳密な名前の署名のためにポータブル実行可能 (PE) ファイルに領域を確保し、少し後の段階、通常はアセンブリが出荷される直前まで、実際の署名を遅らせることができます。
アセンブリへの遅延署名を行うには、次のようにします。
最終的な署名を行う組織のキー ペアの公開キー部分を取得します。 通常、このキーは、Windows SDK により提供される厳密名ツール (Sn.exe) を使って作成できる .snk ファイルの形式です。
System.Reflection から次の 2 つのカスタム属性を含むアセンブリのソース コードに注釈を付けます。
公開キーをパラメーターとして含むファイルの名前を、そのコンストラクターに渡す AssemblyKeyFileAttribute。
その遅延署名がパラメーターとして true をそのコンストラクターに渡すことで使用されていることを示す AssemblyDelaySignAttribute。
次に例を示します。
[assembly:AssemblyKeyFileAttribute("myKey.snk")]; [assembly:AssemblyDelaySignAttribute(true)];[assembly:AssemblyKeyFileAttribute("myKey.snk")] [assembly:AssemblyDelaySignAttribute(true)]<Assembly:AssemblyKeyFileAttribute("myKey.snk")> <Assembly:AssemblyDelaySignAttribute(True)>コンパイラは、アセンブリ マニフェストに公開キーを挿入し、完全に厳密な名前の署名のために PE ファイルの領域を確保します。 このアセンブリを参照する他のアセンブリがキーを取得して自身のアセンブリ参照に格納できるように、アセンブリのビルド中に実際の公開キーが格納されている必要があります。
アセンブリには有効な厳密な名前の署名がないため、その署名の検証をオフにする必要があります。 これは、厳密な名前ツールで –Vr オプションを使用して行うことができます。
次の例では、myAssembly.dll と呼ばれるアセンブリの検証をオフにしています。
sn –Vr myAssembly.dll厳密な名前ツールを実行できない Advanced RISC Machine (ARM) マイクロプロセッサなどのプラットフォームで検証をオフにするには、 –Vk オプションを使用してレジストリ ファイルを作成します。 検証をオフにするコンピューターのレジストリにこのレジストリ ファイルをインポートします。 次の例では、
myAssembly.dllにレジストリ ファイルを作成しています。sn –Vk myRegFile.reg myAssembly.dll–Vr または –Vk のどちらかのオプションでは、テスト キー署名のための .snk ファイルを任意で含めることができます。
警告
セキュリティに関しては、厳格な名前に依存しないでください。 厳格な名前は、一意の ID を提供するだけです。
注意
64 ビット コンピューターの Visual Studio を使用した開発中に、遅延署名を使用して、Any CPU のアセンブリをコンパイルする場合は、 -Vr オプションを 2 回適用しなければならない場合があります。 (Visual Studio では、Any CPU はプラットフォーム ターゲットのビルド プロパティの値です。コマンド ラインからコンパイルする場合は、これが既定です。)コマンド ラインまたはファイル エクスプローラーからアプリケーションを実行する場合は、64 ビット バージョンの Sn.exe (厳密な名前ツール) を使用して、アセンブリに -Vr オプションを適用します。 設計時に Visual Studio にアセンブリを読み込む (たとえば、アプリケーションの他のアセンブリで使用されているコンポーネントがアセンブリに含まれている) 場合は、32 ビット バージョンの厳密な名前ツールを使用してください。 これは、Just-In-Time (JIT) コンパイラが、コマンド ラインからアセンブリを実行する場合には 64 ビットのネイティブ コードに、設計時の環境にアセンブリを読み込む場合には 32 ビットのネイティブ コードにアセンブリをコンパイルするためです。
後ほど (通常は出荷の直前)、厳密な名前ツールで –R オプションを使用して実際に厳密な名前の署名を行うため、組織の署名機関にアセンブリを送信します。
キー ペア sgKey.snk を使用して厳密な名前で myAssembly.dll というアセンブリに署名する例を、次に示します。
sn -R myAssembly.dll sgKey.snk