解説

インサイド .NET Framework [改訂版]

第2回 アセンブリのアイデンティティ

吉松 史彰
2003/07/02

Page1 Page2 Page3 Page4 Page5

遅延署名機能の利用

 ところで、Microsoftのキー・ペアの管理方法を聞いて、「そんなに厳重にしまってあったら、開発中にアセンブリに厳密名をつけるためにキー・ペアを借りるにはかなり厄介な手順で承認をもらうんだろうなぁ」という疑問がわかなかっただろうか? そう、厳重に保管してしまうと、アセンブリをビルドするたびに取り出すのが大変になってしまうのだ。セキュリティと利便性は両立しないとはよくいったものである。

 かといって、Microsoftのあらゆる部門にキー・ペアを配ってしまったら、どこから漏れるか分かったものではない。そんなことは絶対にできない。ではどうするか。.NET Frameworkでは、アセンブリに遅延署名を行うことができるようになっている。

 署名をしなければ厳密名が付いていないものと見なされてしまう。そこで、.NET Frameworkでは、アセンブリに署名をせずに公開キーだけを埋め込めるようにしている。公開キーがあればアセンブリの名前が確定するので、ほかのアセンブリから参照することもできる。公開キーは文字どおり公開されているものなので、開発者全員が持っていても何の問題もない。

公開キーを取り出す

 先ほど作成したキー・ペアから公開キーだけを取り出すには、sn.exeで次のコマンドを実行する。

% sn -pc CspContainer fumiakiypublic.snk

 これで公開キーだけが入ったファイルが作成できた。これはファイルとして持っていても構わないし、開発者全員に配っても構わない。「公開」キーだからだ。

署名をせずに公開キーだけを埋め込む

 取りあえず開発を続行するためには、アセンブリに公開キーを埋め込まなくてはならない。公開キーだけを書き込む手順は、秘密キーで署名する手順とよく似ている。

■ソース・コードに名前を埋め込む

 ソース・コードに、アセンブリ・レベルの属性として次のように指定すると公開キーを埋め込むことができる。

[assembly: System.Reflection.AssemblyKeyFile("fumiakiypublic.snk")]
[assembly: System.Reflection.AssemblyDelaySign(true)]
ソース・コードに公開キーを埋め込むための属性の記述例

 まず、AssemblyKeyFile属性に今作ったばかりの公開キーだけが入っているファイルを指定する。これだけではコンパイラがそのファイルに入っている秘密キーで署名しようとしてしまうので、それを抑止するためにAssemblyDelaySign属性を指定して、遅延署名を行う(ので公開キーだけを埋め込めばよい)ことを指示している。

■アセンブリ・リンカ al.exeを利用する

 al.exeを使ってアセンブリを作るときに、公開キーを埋め込むことができる。

% al.exe /delaysign+ /keyfile:fumiakiypublic.snk <モジュールファイル>

 /delaysignオプションで遅延署名を行うことを指定し、/keyfileオプションで公開キーが入っているファイルを指定する。

 ソース・コードに書いておくか、al.exeを利用すれば、アセンブリに公開キーだけを埋め込んで、署名は後回しにできるのだ。これで、開発中にいちいちビル・ゲイツ会長に許可をもらわなくても、アセンブリをビルドできるようになる。

 遅延署名にはもう1つ効能がある。.NET Frameworkの現在のリリースでは、AssemblyKeyName属性やAssemblyKeyFile属性に指定したコンテナ名やファイル名が、そのままマニフェスト・メタデータに書き込まれてしまうという問題がある。AssemblyKeyFile属性で絶対パスを指定した場合は、パスまで丸見えだ。これはセキュリティ上あまりよろしいことではない。遅延署名を行っていれば、ここに書き込まれているのは公開キーのファイル名になるので、仮にファイル名が漏洩しても実害は大きくないというわけだ。


 INDEX
  解説 インサイド .NET Framework [改訂版]
  第2回 アセンブリのアイデンティティ
    1.アセンブリの名前
    2.厳密名とアセンブリ
  3.署名のないアセンブリ
    4.遅延署名したアセンブリを試す
    5.アセンブリの名前の参照
 
インデックス・ページヘ  「解説:インサイド .NET Framework [改訂版]」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間