IEからロードするアセンブリへの警告(その2)

いろいろと調べていたが、Windows XP+Servicepack2とInternetExplorer6+累積パッチ(以降IE)での組み合わせにおいて、IEが.NETで作られたアセンブリをロードする際に、警告を発する現象の結論として、

  • IEのセキュリティ設定をどんなに甘くしても警告ダイアログが表示される
  • 警告を出さないようにするには、アセンブリにディジタル(コード)署名を施す必要がある

ということが判った。
警告ダイアログも一回だけ表示されるのであれば、まだユーザ側も我慢できるだろうが、毎回では文句もでよう。(ClickOnce等と違い、インストールされる訳でではないので、警告はIEによりアセンブリがロードされる度に表示される)
ならば、署名を施すことで警告は本当に出なくなるのかを試してみる必要がある、ということで検証してみた。以下、その方法である。

これはSDKに添付されてくるmakecertで簡単に作成できる。

makecert -n "CN=KazzCA" -sk KazzContainer -sr currentuser -ss My -# 1 -$ commercial KazzCA.cer

等として証明書を作成する。オプションはMSDN等を参照のこと。

  • 2.証明書を信頼された発行元として登録する

1.で作成したディジタル証明書自体は正等だが、自らが作成したものであり、自らを証明することはできない。本来であれば第三者である、CA(Certificate Authority)認証局等に依頼し、自らを証明する証明書を取得するのだが、ここでは動くことを確認したいだけなので、あくまで"テスト用"として信頼されたものとして、証明書を登録する。
この手順は敢えて書かない。しかし、署名されたJavaアプレットのテストやActiveXのテストには避けられない手順なので、探せばすぐに方法は見つかるだろう。ポイントは証明書自体ではなく、証明書のルート(Root Agency)が信頼されているかどうか、である。

2.で作成した「発行元が信頼された」証明書を用いて.NETアセンブリにディジタル署名によるコード署名を施す。.NET1.1時代のSDKではsigncode.exeというGUIツールがあって便利だったのだが、.NET2.0ではsigntool.exeというコマンドラインツールだけになっていてがっかりしたのだが、なんてことはない、オプション signwizardで従来どおりGUIも使えるのだった。
signtool.exeのオプションもMSDN参照のこと。


ここまでで作業は完了だ。あとは、実際にアセンブリをWebサーバ上に置き、コンテンツにはIEがホスティングするアセンブリをロードするようにHTMLにObjectタグを記述するのだが、この辺は過去の日記にも書いてあるので詳しいことは[.NETコントロールをIEでホストするには]からのリンクを参照のこと。

ここまでの作業が終わったら、Webサーバ経由でアセンブリをロードするページにアクセスしてみると、今度は同じ警告でも以下のようなダイアログが表示されるはずだ。

昨日の日記で載せていたような赤い盾のアイコンは消えて、黄色い盾になっているが、これはアセンブリが信頼できる発行元が発行したディジタル証明書により、コード署名されていることの証だ。
追加オプションの表示をクリックして、発行元のソフトウェアを常に信頼するように指定すれば、

以降、IEのキャッシュを完全に削除したりしなければ、二度と同様のダイアログは表示されることは無いはずだ。

...しかし、ここまでブラウザ側ががちがちだと.NET側のコードアクセスセキュリティはなんなのか、ということにならないのであろうか。

今回はテストということを想定して、敢えて「偽」のルート証明書を作成しているが、セキュリティとしては非常な危険な行為なので、特に、サーバ上で真似をしてトラブルが発生しても私は関知しないのであしからず。