Brian Noyes
Microsoft MVP
April 2005
日本語版最終更新日 2005 年 7 月 29 日
適用対象 :
Visual Studio 2005
概要 : ClickOnce セキュリティでは、コード アクセス セキュリティが提供するランタイム セキュリティ保護を利用できるだけでなく、ClickOnce によるアプリケーション配置の際に、特定のアプリケーションに対する権限を動的に決定することもできます。
目次
信頼された発行者および ClickOnce アプリケーション署名の基礎
起動時の ClickOnce セキュリティ チェック
ゾーンについて
ClickOnce 信頼された発行者を機能させる
プロセスの自動化
まとめ
執筆者紹介
ClickOnce セキュリティでは、ユーザーに確認を求めるか、または信頼された発行者に基づいて、ClickOnce 配置アプリケーションに対する権限の昇格を自動的に行うことができます。ClickOnce でアプリケーションを配置する際は、アプリケーションが実行する操作、またはアプリケーションがアクセスしようとするリソースに、現在のポリシーに基づいて付与される権限よりも高いコード アクセス セキュリティ (CAS) 権限が必要です。そのような場合、既定では、クライアント マシン上の .NET Framework ランタイムによって、アプリケーションをインストールして高い信頼を与えるかどうかを確認するメッセージがユーザーに表示されます。
管理者がデスクトップを管理し、各デスクトップに対する構成制御が可能なエンタープライズ環境では、一般に、ユーザーに信頼の決定を促すメッセージを表示することは避けた方がよいといえます。ほとんどのユーザーは、信頼の決定が意味するものを理解するだけの十分な知識がなく、どのような場合にアプリケーションに権限を付与すべきか、すべきでないかがわかりません。ClickOnce では、ユーザーに確認を求めるのではなく、ClickOnce アプリケーションが自動的に独自の権限を昇格できるようにすることで、この問題に対応しています。これは、アプリケーション マニフェストが信頼された発行者によって署名されている場合に可能です。
信頼された発行者および ClickOnce アプリケーション署名の基礎
信頼された発行者はどのように構成されるのでしょうか。まず、ClickOnce 配置マニフェストおよびアプリケーション マニフェストに、必ず発行者証明書を使用して署名します。次に、ClickOnce アプリケーションの署名に使用した証明書をユーザーのマシンの Trusted Publishers 証明書ストアに設定します。最後に、証明書を発行した証明機関をユーザーのマシンの Trusted Root Certificate Authority 証明書ストアに設定します。これらの 3 つの要素について、それぞれ順に掘り下げて説明します。
Visual Studio 2005 で Windows フォーム アプリケーションを作成してから、ClickOnce でそのアプリケーションを発行する場合、Visual Studio は自動的に発行者証明書を生成し、アプリケーションが発行されるときに、その証明書を使用してアプリケーションに署名します。その際、Visual Studio は個人用の証明書ファイル (.pfx ファイル) を生成し、そのファイルに既定のファイル命名規則に従った <ProjectName>_TemporaryKey.pfx という名前を付けて、Visual Studio プロジェクトに追加します。これは自動的に行われるため、このような処理が行われていることに気付かないこともあるでしょう。
Note Beta 1 では、厳密な名前のキー ファイル (命名規則では .snk ファイル) を使用してマニフェストに厳密な名前を付けることができます。Beta 2 および RTM では、この機能はサポートされなくなったので、発行者証明書を使用してマニフェストに署名する必要があります。発行者証明書は、通常 .pfx ファイルで、パスワードで保護されているものと保護されていないものがあります。
署名プロセスでは、証明書の公開キーや秘密キーを使って、ClickOnce アプリケーション用に生成された配置 XML マニフェスト ファイルとアプリケーション XML マニフェスト ファイルに XML デジタル署名を適用します。このデジタル署名方式により、マニフェスト ファイルに埋め込まれた公開 キーに基づいて、特定の ClickOnce アプリケーション配置の署名者を確認できます。また、署名された以降にその XML ファイルが改ざんされていないことや、その内容に何らかの変更が加えられたことを確認できます。これにより、アプリケーションが信頼された証明機関から発行された後、悪意のある第三者によって ClickOnce アプリケーションに意図されていない設定やファイルが追加されるのを防ぐことができます。
発行者証明書には 2 つの形式があります。1 つは自己生成型で、もう 1 つはサードパーティ (Verisign など) による承認です。証明機関によって発行された証明書には、証明書自体にそのことを確認できる証明書が付いています。自己生成証明書とは開発を目的として作成するもので、基本的に、作成者自身が証明書に示される証明機関と発行者の両方になります。実稼動環境で使用するには、サードパーティによって生成された証明書を使用する必要があります。サードパーティとは、Verisign のような外部企業、またはエンタープライズ環境におけるドメイン管理者など内部の証明機関のいずれかを指します。
信頼された発行者であると見なされるには、発行者証明書がユーザーのマシンの Trusted Publishers 証明書ストアにインストールされている必要があります。また、発行者証明書を発行する証明機関自体の証明書が Trusted Root Certification Authority 証明書ストアにインストールされている必要があります。Windows の ertmgr.exe 証明書管理コンソールを使用すると、証明書をユーザーのマシンの証明書ストアにインストールし、管理することができます。さらに、Visual Studio 2005 を使用して証明書をインストールすることもできます。この記事の後半では、Visual Studio を使用したプロセスについて、順を追って説明します。
起動時の ClickOnce セキュリティ チェック
ユーザーのデスクトップで ClickOnce アプリケーションが初めて起動されると、まず .NET Framework ランタイムは、署名にどのような発行者証明書が使用されていても、アプリケーション マニフェストが、その証明書で署名された後で改ざんされていないことを確認します。アプリケーション マニフェストに問題がない場合、ランタイムは Trusted Root Certification Authority ストアを調べて、そこに発行者証明書の発行元の証明書がインストールされているかどうかを確認します。その後、その証明書の発行者は誰なのかを調べ、その発行者の証明書が Trusted Publishers ストアにあるかどうかを確認します。この 2 点の確認が済むと、既定ではユーザーにメッセージが表示されずに、アプリケーション マニフェスト ファイルで指定されたいずれかの権限がアプリケーションに付与されます。このアプリケーションに対する信頼がユーザーの .NET Framework セキュリティ ポリシーに追加され、その後アプリケーションが起動および実行されます。権限がアプリケーション マニフェストで適切に指定されている場合は、ユーザーに対してメッセージやセキュリティ例外が表示されることはありません。
証明書に示された証明書の発行元と発行者の両方がクライアント マシンで不明 (ストアにインストールされた証明書に基づく) の場合、図 1 に示すダイアログ ボックスがユーザーに表示され、ユーザーはアプリケーションがどのゾーンから起動されているかに応じて、必要な権限をアプリケーションに与えるかどうかを決定できます。下部の [詳細] リンクをクリックすると、図 2 に示すダイアログ ボックスが表示され、[インストール] ボタンをクリックした場合の結果に関する詳細がユーザーに示されます。ただし、実際にどのような結果になるかがほとんど説明されていないため、一般的なセキュリティ ダイアログと同様に、概してユーザーを不安にさせる可能性があります。
図 1. 信頼されていない発行者および証明機関に関するメッセージ
図 2. [詳細] ダイアログ
アプリケーション マニフェストの署名に使用される証明書が信頼されたルート証明機関によって生成されていても、特定の発行者証明書が Trusted Publishers ストアに存在しない場合は、やはりユーザーにメッセージが表示されます。このメッセージは、発行者証明書の発行元が不明の場合よりも多少わかりやすい内容です (図 3 を参照)。Authenticode 証明書テクノロジおよび信頼されたルートを使用すると、発行元の組織がどこであっても、少なくとも証明書の発行元と一致していると信頼できるため、わかりやすいメッセージには発行者の組織が表示されています。発行元の証明機関を信頼するのであれば、発行者が別の発行者を装っているのではないことを信頼できます。
図 3. 信頼された証明機関に関するメッセージ
アプリケーションの信頼が特定のアプリケーション用に作成された後は、信頼された発行者証明書に基づいて自動設定されるか、メッセージ表示に従ってアプリケーショのインストールを許可したユーザーに基づいて自動設定されるため、同じアプリケーションの以降のバージョンでは、セキュリティ権限の変更を求められない限り、メッセージが再度表示されることはありません。
ゾーンについて
発行元ベースの信頼決定には、CAS で使用される 5 つの組み込みのセキュリティ ゾーン (MyComputer、LocalIntranet、Internet、TrustedSites、UntrustedSites) があります。これらのゾーンは、ClickOnce アプリケーションの権限の昇格に関して、どのような種類のメッセージをユーザーに表示するかを決定するのに使用されます。各ゾーンは ClickOnce アプリケーションが起動される場所の内容に対応しており、起動場所は ClickOnce アプリケーションの配置マニフェスト (.application ファイル)に対して使用する絶対パスのアドレスで判断します。
表 1 に、配置マニフェストに使用されるアドレスに基づいた起動ゾーンの例を示します。アドレスがネットワーク ドライブ以外のドライブへのローカル ファイル パスである場合は、基本的に MyComputer ゾーンで起動されるアプリケーションに分類されます。アドレスにネットワーク プロトコル (http または UNC ファイル共有) が使用され、アドレスのサーバー部分が単一のマシン名である場合は、アプリケーションは LocalIntranet ゾーンから起動されていると見なされます。アドレスのサーバー名部分にドットが含まれている場合は、Internet ゾーンから起動されていると見なされます。TrustedSites および UntrustedSites は、Internet Explorer の信頼済みサイトおよび制限付きサイトのセキュリティ設定の一部として構成される個別のアドレスに依存します。
表 1. ClickOnce アプリケーションが起動されるゾーンの例
| 起動アドレス | 起動ゾーン |
| http://deploymentserver/MyClickOnceApp/MyClickOnceApp.application | LocalIntranet |
| \\deploymentserver\MyClickOnceApp\MyClickOnceApp.application | LocalIntranet |
| http://some.dotted.servername/Apps/MyClickOnceApp.application | Internet |
| \\127.0.0.1\sharefolder\MyClickOnceApp.application | Internet |
| C:\inetpub\wwwroot\MyClickOnceApp\MyClickOnceApp.application | MyComputer |
既定では、MyComputer、LocalIntranet、または TrustedSites が設定され、ClickOnce アプリケーションが信頼された発行者によって署名されていない場合に、そのアプリケーションのセキュリティ権限の昇格を求めるメッセージがユーザーに表示されます。Internet ゾーンが既定値に設定されていると、アプリケーション マニフェストが信頼されたルート証明機関が発行した発行者証明書で署名されている場合に、必要に応じて (つまり、発行者証明書が Trusted Publisher ストアにインストールされていない場合)、ユーザーに権限の昇格を求めるメッセージを表示されます。インターネットから起動されたアプリケーションが信頼されたルート証明機関が発行した証明書で署名されていない場合、アプリケーションの実行は許可されません。UntrustedSites ゾーンが既定値に設定されていると、アプリケーションが、信頼されたルート証明機関が発行した信頼された発行者証明書で署名されていない場合は、アプリケーションの実行が許可されません (ユーザーへのメッセージ表示は許可されません)。
これらの設定はエンタープライズの要件に合わせて変更できます。変更するには、ユーザーに表示されるメッセージのポリシーを決定するために ClickOnce が確認する、隠れたレジストリ キーを設定します。上述の動作はそれぞれ、このレジストリ キーを介して各ゾーンに設定される値に対応しています。
レジストリ キー \HKLM\Software\Microsoft\.NETFramework\Security\TrustManager\PromptingLevel を使用すると、メッセージ表示に関する動作をカスタマイズできます。このキーは、.NET Framework 2.0 をインストールした直後の既定の状態では存在しないので、これらの設定をカスタマイズする場合は、手動で作成する必要があります。
そのレジストリ キーの下には、MyComputer、LocalIntranet、Internet、TrustedSites、UntrustedSites という 5 つの文字列をどれでも追加できます。これらの文字列は、それぞれ関連するゾーンに対応しています。これらの文字列の値として、Enabled、Disabled、AuthenticodeRequired の3 つの文字列のうち 1 つを設定できます。Enabled はMyComputer、LocalIntranet、および TrustedSites ゾーンの既定値です。Internet の既定値は AuthenticodeRequired で、UntrustedSites の既定値は Disabled です。表 2 に、各ゾーンに設定可能な値と起動時の動作を示します。図 4 は、既定の動作に設定されたレジストリ キーの値を示しています。このキーは、既定では存在せず、通常は、既定値以外の値を設定する場合に作成するキーであることに注意してください。
表 2. PromptingLevel レジストリ キーの値と起動時の動作
| 値 | 信頼されたルート証明機関以外 | 信頼されたルート証明機関が発行した証明書 | 信頼されたルート証明機関および信頼された発行者証明書 |
| Enabled | わかりにくいメッセージを表示 | わかりやすいメッセージを表示 | ユーザーに対するメッセージ表示なし。権限を付与してアプリケーションを起動 |
| AuthenticodeRequired | アプリケーションは実行不可 | わかりやすいメッセージを表示 | ユーザーに対するメッセージ表示なし。権限を付与してアプリケーションを起動 |
| Disabled | アプリケーションは実行不可 | アプリケーションは実行不可 | ユーザーに対するメッセージ表示なし。権限を付与してアプリケーションを起動 |
図 4. ユーザーに表示されるレジストリ キーの値
ClickOnce 信頼された発行者を機能させる
信頼された発行者をテストするには、開発に使用しているマシンに証明書を設定する必要があります。まず、ClickOnce アプリケーションの署名に使用する証明書を用意し、開発用またはテスト用マシンの対象となる証明書ストアにその証明書を設定します。既に説明したように、初めてアプリケーションを発行するまでに ClickOnce マニフェストの署名に使用する証明書が設定されていない場合、Visual Studio では ClickOnce プロジェクトごとに新しい証明書が生成されます。新しいテスト用証明書を生成して、それを既知の場所に保存しておき、開発中の ClickOnce プロジェクトすべての署名に使用することで、証明書ストアがたくさんのテスト用証明書で乱雑にならないようにすることをお勧めします。さらに、自動的に生成される証明書はパスワードで保護されていないので、パスワードで保護されている証明書ファイルのみを使用することを強くお勧めします。
Visual Studio 2005 で、パスワードで保護されている証明書ファイルを新しく生成するには、プロジェクトの [プロパティ] ウィンドウに移動します (ソリューション エクスプローラで [プロパティ] ノードをダブルクリックするか、そのプロジェクトのノードを右クリックしてコンテキスト メニューの [プロパティ] をクリックします)。
[Signing] タブをクリックし、[Sign the ClickOnce Manifests] チェック ボックスをオンにしてから、[Create Test Certificate...] ボタンをクリックします (図 5 を参照)。
パスワードの入力を求められ、その後、既定の名前が付いた新しい .pfx ファイルがプロジェクトに追加されます。この証明書はマニフェストの署名に使用される証明書としても設定され、Windows の個人用の証明書ストアにインストールされます。ここでファイル名を変更できます。再利用可能な場所にそのファイルをコピーしてから、[Signing] タブの [Select From File...] ボタンをクリックし、任意のアプリケーション用の証明書としてその証明書を設定します。
図 5. プロジェクトの [プロパティ] の [Signing] タブ
証明書を用意し、プロジェクトの [プロパティ] の [Signing] タブで ClickOnce マニフェストの署名に使用する証明書を指定しておくと、Visual Studio でアプリケーションを発行することができ、マニフェストはその証明書を使用して署名されるようになります。"実際の" 発行者証明書 (Verisign で承認されたものや、他の信頼されたート証明機関によって署名され、所属する開発組織で使用しているもの) がある場合は、上述のファイルから、または、プロジェクトの [プロパティ] の [Signing ] タブで [Select From Store...] ボタンをクリックして個人用の証明書ストアに格納した証明書を指定することで、その証明書を使用することもできます。
信頼された発行者による配置でユーザーにメッセージが表示されないようにする方法を確認するには、アプリケーションが ClickOnce で起動されるマシン (通常は、最初の試行や開発のために使用している開発用マシン) に発行者証明書を設定する必要があります。上述の手順に従って、または Visual Studio に付属の makecert.exe コマンド ユーティリティを使用して新しく証明書を作成した場合、Trusted Root Certification Authorities ストアにその証明書を追加することも必要です。これは、証明書の作成者が単なる発行者ではなく、証明書の発行元でもあるためです。その後 Trusted Publishers ストアにも同じ証明書をインストールします。これは、メッセージを表示しないでアプリケーションを起動させるための最後の手順です。
この一連の手順を具体的に説明するために、正確に手順を追いながら例を示します。Visual Studio 2005 で新しい Windows Application プロジェクトを開始し、そのプロジェクトに ClickOnceTrustedPub という名前を付けます。プロジェクトが作成されたら、そのプロジェクト ノードの下にある、ソリューション エクスプローラ ツリーの [プロパティ] ノードをダブルクリックしてプロジェクトの [プロパティ] に移動し、[Signing] タブをクリックします。
次に、[Sign the ClickOnce manifests] チェック ボックスをオンにします。
[Create Test Certificate...] ボタンをクリックしてから、証明書のパスワードを入力します。
新しく作成され、プロジェクトに追加されるファイルには、ClickOnceTrustedPub_TemporaryKey.pfx という名前が付いています。ソリューション エクスプローラで、このファイル名を devcert.pfx に変更します。使用しているマシンの共有の開発用フォルダにファイルをコピーして、以降のプロジェクトでもそのファイルを利用できるようにすることで、何度も証明書を生成して設定しなくても済むようにします。証明書ファイルの作成時に、Visual Studio は Personal 証明書ストアにその証明書をインストールします。
この証明書を Trusted Root Certificate Authority および Trusted Publisher ストアに追加するには、プロジェクトの [プロパティ] で [Signing] タブの [詳細] ボタンをクリックします。
証明書情報のダイアログが表示されます (図 6 を参照)。[全般] タブの下部にある [Install Certificate...] ボタンをクリックすると、[Certificate Import Wizard] が表示されます。
図 6. 証明書情報のダイアログ
次に、ウィザードの [Place all certificates in the following store] ラジオ ボタンをクリックしてから、[参照] ボタンをクリックします (図 7 を参照)。
ダイアログ ボックスが開くので、ここで証明書ストアの一覧からストアを選択します (図 8 を参照)。
図 7. 証明書ウィザードでのストアの選択
図 8. 証明書ストアを選択するダイアログ ボックス
このプロセスでは、最初に [Trusted Root Certificate Authorities] ストアを選択し、ウィザードの [次へ]、[完了] を順にクリックします。
ルート証明機関のインストールによって生じる危険を詳細に説明した、セキュリティ警告のダイアログが表示されます。[はい] をクリックして先に進みます。この操作を行わない限り、ClickOnce 信頼された発行者の機能を試すことはできませんが、ダイアログで説明されている危険がどのようなものであるか理解したうえで、この操作を行ってください。
作成した証明書を第三者が取得して、その証明書でアプリケーションに署名し、開発に使用しているマシンでそのアプリケーションを起動した場合、Windows は信頼された証明機関が承認した企業が発行したアプリケーションとして、そのアプリケーションを扱います。
上述の、[詳細] ボタンをクリックする手順以降のプロセスを繰り返します。今回は、Trusted Publishers ストアに同じ証明書をインストールします。
この操作を実行すると、アプリケーションを ClickOnce で発行できるようになります。アプリケーションを発行するには、Visual Studioの [ビルド] メニューの [Publish <ProjectName>] をクリックし、ポップアップ表示されるウィザードの [完了] をクリックします。
アプリケーションがビルドされ、既定の ClickOnce 発行設定でアプリケーションが発行されて、Web ページが表示されます。Web ページの [インストール] ボタンをクリックすると、Web ページからクライアントとしてインストールのテストを行うことができます。
[インストール] ボタンをクリックすると、どのような形式のメッセージも表示されずに、アプリケーションがデスクトップにダウンロードされて実行されます。ClickOnce アプリケーションによって求められる既定の権限は、無制限 (完全な信頼) です。表示されている既定の [インストール] ボタンのリンクには、LocalIntranet ゾーンの URL が使用されます。
そのため、信頼された発行者証明書を設定しないでこのプロセスを同じように繰り返すと、図 1 に示したダイアログ ボックスが表示されることになります。
プロセスの自動化
多くのユーザー マシンを維持する運用環境では、マシンごとに Visual Studio を利用して発行者証明書を設定しなくても済むようにしたいと思うことがあるでしょう。これを可能にするには、Windows に付属している証明書管理コンソール (certmgr.exe) を使用します。コマンド ラインから単に certmgr.exe を実行するだけで、Microsoft 管理コンソール (MMC) のウィンドウが表示され、ローカル マシンのどの証明書ストアに対しても証明書の追加または削除を行うことができます。それでも、証明書を設定する際に、ローカル マシンごとに操作を行わなくても済むようにしたいと思うこともあるでしょう。このプロセスは、いくつかのコマンド ライン パラメータを指定した certmgr.exe を使用して自動化することもできます。
まず、[エクスポート] ボタンをクリックして、certmgr から証明書の公開部分を証明書ファイル (.cer) にエクスポートします。
図 9. 証明書をエクスポートする Certmgr.exe
この操作が完了すると、その証明書ファイルをターゲット マシンにコピーし、コマンド ラインから certmgr.exe を実行できます。適切なスイッチを指定したコマンド ライン パラメータとして証明書を格納するストアと共に証明書のファイル名を渡します。そうすると、ターゲット マシンに証明書がインストールされます。
certmgr –add alice.cer –s Root
certmgr –add alice.cer –s TrustedPublisher
この処理のすべてはスクリプト化されるか、Visual Studio のセットアップおよび配置プロジェクト (または他の形式のインストーラ) によってカスタム インストーラに追加されます。その結果、Windows インストーラ パッケージ (.msi ファイル) が、ClickOnce アプリケーションのブートストラップに追加されます。ブートストラップの詳細については、Sean Draine 氏の記事「Use the Visual Studio 2005 Bootstrapper to Kick-Start Your Installation」(MSDN Magazine、2004 年 10 月号) を参照してください。
まとめ
ClickOnce セキュリティでは、コード アクセス セキュリティが提供するランタイム セキュリティ保護を利用できるだけでなく、ClickOnce によるアプリケーション配置の際に、特定のアプリケーションに対する権限を動的に決定することもできます。ただし、この柔軟性には代償が伴います。メッセージを表示してユーザーにアプリケーションの権限の昇格を任せるかどうか、およびそのメッセージを発行者証明書の発行元に基づいて表示させるかどうかを決定しなければならないためです。ClickOnce の既定の動作は非常にわかりやすいものです。信頼された発行者で配置されているアプリケーションであれば、自動的にその権限を昇格するか、または、発行者を信頼するかどうかユーザーに判断させるメッセージを表示するかのどちらかです。より制御された環境では、ユーザーに対するメッセージを制限したい場合があります。この記事では、PromptingLevel レジストリ キーを使用し、ユーザーのマシンに発行者証明書および信頼されたルート証明機関を設定して、この制限を実現する方法を詳細に説明しました。さまざまな値の効果や、その値が異なる証明書ストア構成でどのように動作するのかを理解することは、ClickOnce のセキュリティ保護を適切に使用するために重要なことです。
執筆者紹介
Brian Noyes は Microsoft MVP であり、IDesign, Inc (http://www.idesign.net) では、講演、教育、執筆活動に従事し、さらにはコンサルタントとしても活躍しています。TechEd US、TechEd Malaysia、Visual Studio Connections、VSLive!、DevEssentials などのカンファレンスで講演を行い、INETA Speakers Bureau からはトップクラスの講演者の 1 人として評価されています。また、MSDN Magazine、Visual Studio Magazine、asp.netPRO、The Server Side .NET、CoDe Magazine、NET Developer's Journal など、さまざまな刊行物に .NET Framework 開発に関する多くの記事を寄せています。最新の著書である『Data Binding in Windows Forms 2.0』(Addison-Wesley、.NET 開発シリーズ) は、2005 年の秋に出版されます。プログラミングを始めた頃、Brian は海軍に所属し、F-14 トムキャットを操縦していました。トップ ガンや U.S. 海軍テスト パイロット スクールに通い、そこでの経験を活かしながら、航空機シミュレーションや航空電子工学 (アビオニクス) システム、プロトタイプ、サポート アプリケーションのプログラミングにスキルを発揮していました。