C#、アセンブリの厳密な名前、遅延署名とは何でしょうか。
以下の用語について、まとめてみました。
- 厳密な名前 Strong Name
- 遅延署名 Dealy Sign
厳密な名前付きアセンブリ (Strong-Named Assemblies)とは
厳密な名前付きアセンブリ(Strong-Named Assemblies)とは、何でしょうか。
以下のように説明がありました。
厳格な名前付きのアセンブリは、アセンブリと一緒に配布された公開キーに対応する秘密キーとアセンブリ自体を使用して生成されます。 アセンブリには、アセンブリ マニフェストが含まれます。ここには、アセンブリを構成するすべてのファイルの名前とハッシュが格納されています。 同じ厳格な名前を持つ複数のアセンブリは、同一である必要があります。
Visual Studio またはコマンド ライン ツールを使用して、アセンブリに厳格な名前を付けることができます。 詳細については、「方法 :厳密な名前でアセンブリに署名する」または「Sn.exe (厳密な名前ツール)」 を参照してください。
Sn.exe (厳密名ツール) を使っての署名方法は、以下に詳しく書かれています。
厳密名ツール (Sn.exe) は、厳密な名前を使用してアセンブリに署名する場合に役立ちます。 Sn.exe には、キーの管理、署名の生成、署名の検査に関する各オプションが用意されています。
ところで、この厳密な名前のアセンブリは開発時点で使うと少しめんどうです。
厳密な名前のアセンブリを開発すると、厳密な名前のターゲット アセンブリを参照する各アセンブリに、そのターゲット アセンブリに厳密な名前を指定するために使用する公開キーのトークンが含まれています。
開発プロセスで、公開キーを使用できる必要があります。
アセンブリへの遅延署名 (Delay Signing an Assembly) とは
そこで、開発時点では遅延署名という方法を使います。
ビルド時に遅延署名または部分署名を使用することで、厳密な名前の署名のためにポータブル実行可能 (PE) ファイルに領域を確保し、少し後の段階 (通常はアセンブリが出荷される直前) まで実際の署名を遅らせることができます。
sn.exeにオプション「-R」ってのがあって、これで再署名がです。
ただ、事前に「遅延署名をするよ」という形式でモノを作っておく必要があります。
アセンブリの遅延署名の方法、手順は次の通りです。
・https://docs.microsoft.com/ja-jp/dotnet/framework/app-domains/delay-sign-assembly
1.
最終的な署名を行う組織のキー ペアの公開キー部分を取得します。 通常、このキーは、Windows Software Development Kit (SDK) によって提供された厳密な名前ツール (Sn.exe) を使用して作成できる .snk ファイルの形式です。
2.
System.Reflection から次の 2 つのカスタム属性を含むアセンブリのソース コードに注釈を付けます。
- 公開キーをパラメーターとして含むファイルの名前を、そのコンストラクターに渡すAssemblyKeyFileAttribute。
- その遅延署名がパラメーターとして true をそのコンストラクターに渡すことで使用されていることを示す AssemblyDelaySignAttribute。
1 2 |
[assembly:AssemblyKeyFileAttribute("myKey.snk")] [assembly:AssemblyDelaySignAttribute(true)] |
3.
コンパイラは、アセンブリ マニフェストに公開キーを挿入し、完全に厳密な名前の署名のために PE ファイルの領域を確保します。 このアセンブリを参照する他のアセンブリがキーを取得して自身のアセンブリ参照に格納できるように、アセンブリのビルド中に実際の公開キーが格納されている必要があります。
4.
アセンブリには有効な厳密な名前の署名がないため、その署名の検証をオフにする必要があります。 これは、厳密な名前ツールで –Vr オプションを使用して行うことができます。
次の例では、myAssembly.dll と呼ばれるアセンブリの検証をオフにしています。
1 |
sn –Vr myAssembly.dll |
厳密な名前ツールを実行できない Advanced RISC Machine (ARM) マイクロプロセッサなどのプラットフォームで検証をオフにするには、–Vk オプションを使用してレジストリ ファイルを作成します。 検証をオフにするコンピューターのレジストリにこのレジストリ ファイルをインポートします。
次の例では、myAssembly.dll にレジストリ ファイルを作成しています。
1 |
sn –Vk myRegFile.reg myAssembly.dll |
–Vr または –Vk のどちらかのオプションでは、テスト キー署名のための .snk ファイルを任意で含めることができます。
5.
後ほど (通常は出荷の直前)、厳密な名前ツールで –R オプションを使用して実際に厳密な名前の署名を行うため、組織の署名機関にアセンブリを送信します。
キー ペア sgKey.snk を使用して厳密な名前で myAssembly.dll というアセンブリに署名する例を、次に示します。
1 |
sn -R myAssembly.dll sgKey.snk |
コメント