ClickOnce 信頼済みパブリッシャーの構成
Brian Noyes
Microsoft MVP
2005 年 4 月
適用対象:
Visual Studio 2005
概要: ClickOnce セキュリティを使用すると、Code Access Security によって提供されるランタイム セキュリティ保護を利用しながら、アプリケーションが ClickOnce を介して展開される時点で特定のアプリケーションのアクセス許可を動的に決定できます。 (11ページ印刷)
内容
信頼された発行元と ClickOnce アプリケーション署名 101
起動時の ClickOnce セキュリティ チェック
ゾーンに入る
ClickOnce Trusted Publishers in Action
プロセスの自動化
まとめ
著者について
ClickOnce セキュリティを使用すると、ユーザープロンプトまたは信頼された発行元に基づいて、ClickOnce 配置アプリケーションの特権を自動的に昇格できます。 ClickOnce を使用してアプリケーションを配置する場合、アプリケーションが実行する操作またはアクセスを試みるリソースには、現在のポリシーに基づいて付与されるアクセス許可よりも大きい Code Access Security (CAS) アクセス許可が必要になる場合があります。 その場合、既定では、クライアント コンピューター上の.NET Framework ランタイムがユーザーにプロンプトを表示し、アプリケーションをインストールして、管理者特権での信頼を付与するかどうかを確認します。
管理者がデスクトップを所有し、各デスクトップに対する構成制御が可能なエンタープライズ環境では、一般に、ユーザーに信頼の決定を求める必要を回避することをお勧めします。 ほとんどのユーザーは、信頼に関する決定の影響を理解するための高度な機能を備えていません。また、アプリケーションのアクセス許可を付与するタイミングと付与すべきでない場合はわかりません。 ClickOnce を使用すると、アプリケーション マニフェストが信頼できる発行元によって署名されている場合に、ClickOnce アプリケーションがユーザーのプロンプトを表示せずに独自の特権を自動的に昇格できるようにすることで、この問題を制御できます。
信頼された発行元と ClickOnce アプリケーション署名 101
では、信頼できる発行元を構成するものは何でしょうか。 まず、ClickOnce 配置マニフェストとアプリケーション マニフェストに必ず発行元証明書で署名する必要があります。 次に、ClickOnce アプリケーションの署名に使用する証明書は、ユーザーのコンピューターの信頼された発行元の証明書ストアで構成する必要があります。 最後に、証明書を発行した証明機関は、ユーザーのコンピューターの信頼されたルート証明機関の証明書ストアで構成する必要があります。 この3枚ずつのレイヤーを順番に剥がします。
Visual Studio 2005 でWindows フォーム アプリケーションを初めて作成し、ClickOnce で発行すると、Visual Studio によって自動的に発行元証明書が生成され、発行時にアプリケーションに署名するために使用されます。 これを行うと、個人用証明書ファイル (.pfx ファイル) が生成され、ProjectName>_TemporaryKey.pfx の既定の<ファイル命名規則を使用して Visual Studio プロジェクトに追加されます。 また、Visual Studio によってこの証明書が個人用証明書ストアに追加され、ClickOnce アプリケーション マニフェストの署名に使用される証明書としてこの証明書を設定するプロジェクト設定が有効になります。 これはすべて自動的に行われるため、発生していることに気付かない場合もあります。
メモ ベータ 1 では、厳密な名前キー ファイル (規則によって .snk ファイル) を使用してマニフェストに厳密な名前を付けることができます。 ベータ 2 と RTM ではこの機能がサポートされなくなり、マニフェストに発行者証明書 (通常はパスワードで保護されている場合とそうでない場合がある .pfx ファイル) で署名する必要があります。
署名プロセスでは、証明書の公開キーと秘密キーを使用して、ClickOnce アプリケーション用に生成された配置およびアプリケーション XML マニフェスト ファイルに XML デジタル署名を適用します。 このデジタル署名アプローチを使用すると、マニフェスト ファイルに埋め込まれる公開キーに基づいて特定の ClickOnce アプリケーション配置に署名したユーザーが把握でき、ファイルが改ざんされていないか、署名されてからその内容が何らかの方法で変更されていないことを確認できます。 これにより、悪意のあるパーティは、信頼された機関によって公開された後、ClickOnce アプリケーションに意図しない設定やファイルを追加できなくなります。
発行元証明書には、自己生成型またはサードパーティ製の検証済み (Verisign など) の 2 種類があります。 証明書は証明機関によって発行されます。証明書自体には、証明書を証明書発行機関として識別する証明書があります。 自己生成証明書は開発目的で作成する証明書であり、基本的には証明書が表す証明機関と発行元の両方になります。 運用環境で使用するには、Verisign などの外部企業またはエンタープライズ環境のドメイン管理者などの内部機関のいずれかである、サード パーティによって生成された証明書を使用する必要があります。
信頼された発行元と見なすには、発行元証明書をユーザーのコンピューターの信頼された発行元証明書ストアにインストールする必要があります。発行元証明書の発行元機関は、信頼されたルート証明機関の証明書ストアに独自の証明書がインストールされている必要があります。 Windows のcertmgr.exe証明書管理コンソールを使用して、コンピューター上のストアで証明書を管理およびインストールできます。また、Visual Studio 2005 を使用して証明書をインストールすることもできます。 この記事の後半で Visual Studio を使用するプロセスについて説明します。
起動時の ClickOnce セキュリティ チェック
ClickOnce アプリケーションがユーザーのデスクトップで初めて起動されるとき、.NET Framework ランタイムは最初にチェックして、署名に使用された発行元証明書で署名されたアプリケーション マニフェストが改ざんされていないことを確認します。 そのチェックを渡すと、ランタイムは信頼されたルート証明機関ストアを調べ、発行元の証明書の発行者の証明書がそのストアにインストールされているかどうかを確認します。 その後、証明書の発行元が誰であるかを確認し、証明書が信頼された発行元ストアに存在するかどうかを確認します。 これら 2 つのことが当てはまる場合、既定ではユーザーにプロンプトが表示されず、アプリケーション マニフェスト ファイルで指定されている特権がアプリケーションに付与されます。 このアプリケーションに対するアプリケーションの信頼がユーザーの.NET Frameworkセキュリティ ポリシーに追加され、アプリが起動して実行されます。アクセス許可がアプリケーション マニフェストで正しく指定されている場合、ユーザーにプロンプトやセキュリティ例外が表示されることはありません。
証明書の発行者と証明書によって表される発行元の両方がクライアント コンピューターで不明な場合 (ストアにインストールされている証明書に基づく)、ユーザーは図 1 に示すダイアログ ボックスでプロンプトが表示され、アプリケーションが必要な特権を取得できるようにするかどうかを決定できます。 は、アプリケーションが起動されるゾーンに応じて異なります。 下部にある [ 詳細情報 ] リンクをクリックすると、図 2 に示すダイアログ ボックスが表示されます。これにより、ユーザーは [ インストール ] ボタンをクリックしたときに何が起きようとしているのかについてもう少し詳しく説明しますが、一般に、ほとんどのセキュリティ ダイアログのように、実際の動作に関する情報が非常に少ないため、恐らくは単なる恐怖にさらされます。
図 1. 信頼されていない発行元と証明機関のユーザー プロンプト
図 2. [詳細情報] ダイアログ
アプリケーション マニフェストの署名に使用される証明書が信頼されたルート証明機関によって生成されるが、特定の発行元証明書が信頼された発行元ストアにない場合でも、ユーザーはプロンプトが表示されますが、発行元証明書の発行者が不明な場合よりも少しわかりやすいプロンプトが表示されます (図 3 を参照)。 よりわかりやすいプロンプトは発行元のorganizationを示します。Authenticode 証明書テクノロジと信頼されたルートを使用すると、発行organizationが証明書の発行者に従っていると言う人であることを少なくとも信頼できるためです。 発行元の権限を信頼している場合は、発行元が自分がそうではないユーザーのふりをしていないと信頼できます。
図 3: 信頼された証明機関のユーザー プロンプト
特定のアプリケーションに対してアプリケーションの信頼が作成された後は、信頼された発行元証明書に基づく自動構成、または要求されたユーザーに基づいてアプリケーションのインストールが許可されるため、要求されたセキュリティ アクセス許可が変更されない限り、同じアプリケーションの後続のバージョンに対して再度プロンプトを表示する必要はありません。
ゾーンに入る
CAS には、生成元ベースの信頼の決定に使用される 5 つの組み込みセキュリティ ゾーンがあります。MyComputer、LocalIntranet、Internet、TrustedSites、および TrustededSites です。 これらの同じゾーンを使用して、ClickOnce アプリケーションのアクセス許可の昇格に関してユーザーに対して許可する必要があるプロンプトの種類を決定します。 各ゾーンは、ClickOnce アプリケーションの起動元のコンテキストに対応します。これは、ClickOnce アプリケーションの配置マニフェスト (.application ファイル) に使用された完全なパス アドレスによって決まります。
表 1 に、配置マニフェストに使用されるアドレスに基づく起動ゾーンの例をいくつか示します。 基本的に、アドレスがネットワークに接続されていないドライブへのローカル ファイル パスである場合、アプリケーションは MyComputer ゾーンで起動されます。 アドレスがネットワーク プロトコル (http または UNC ファイル共有) を使用し、アドレスのサーバー部分が単一のコンピューター名である場合、LocalIntranet ゾーンから取得されると評価されます。 アドレスのサーバー名の部分にドットが含まれている場合は、インターネット ゾーンからの情報として評価されます。 TrustedSites と TrustededSites は、インターネット エクスプローラーの信頼済みサイトと制限付きサイトのセキュリティ設定の一部として構成されている個々のアドレスによって異なります。
表 1 ClickOnce 起動ゾーンの例
起動アドレス | 起動ゾーン |
---|---|
http://deploymentserver/MyClickOnceApp/MyClickOnceApp.application | LocalIntranet |
\\deploymentserver\MyClickOnceApp\MyClickOnceApp.application | LocalIntranet |
http://some.dotted.servername/Apps/MyClickOnceApp.application | インターネット |
\\127.0.0.1\sharefolder\MyClickOnceApp.application | インターネット |
C:\inetpub\wwwroot\MyClickOnceApp\MyClickOnceApp.application | MyComputer |
既定では、MyComputer、LocalIntranet、TrustedSites は、そのアプリケーションが信頼された発行元によって署名されていない場合に ClickOnce アプリケーションのセキュリティ特権を昇格するようにユーザーに求めるメッセージを表示できるように構成されています。 インターネット ゾーンの既定値は、アプリケーション マニフェストが信頼されたルート機関によって発行された発行元証明書によって署名されている場合、そのアプリケーションは必要に応じて管理者特権のアクセス許可をユーザーに求めることができます (つまり、発行元証明書は信頼された発行元ストアにもインストールされません)。 インターンが起動したアプリケーションが、信頼されたルート機関によって発行された証明書で署名されていない場合、アプリケーションの実行は許可されません。 TrustededSites ゾーンの既定値は、信頼されたルート機関によって発行された信頼された発行元証明書によってアプリケーションが署名されていない場合、アプリケーションの実行は許可されません (つまり、ユーザープロンプトは許可されません)。
これらの設定は、ユーザーのプロンプト ポリシーを決定するために ClickOnce によってチェックされるあいまいなレジストリ キーを構成することで、エンタープライズに必要に応じて変更できます。 上記の各動作は、このレジストリ キーを使用して各ゾーンに設定できる値に対応しています。
レジストリ キー \HKLM\Software\Microsoft\NETFramework\Security\TrustManager\PromptingLevel は、プロンプトの動作をカスタマイズできるレベルです。 このキーは、.NET Framework 2.0 のインストール後に既定では存在しないため、これらの設定をカスタマイズする場合は手動で作成する必要があります。
そのレジストリ キーの下に、MyComputer、LocalIntranet、Internet、TrustedSites、および TrustededSites という名前の 5 つの文字列値のいずれかを追加できます。 これらはそれぞれのゾーンに対応します。 これらの値として、Enabled、Disabled、AuthenticodeRequired の 3 つの文字列のいずれかを設定できます。 [有効] は、MyComputer、LocalIntranet、TrustedSites ゾーンの既定値です。 インターネットの既定値は AuthenticodeRequired で、TrustededSites の既定値は [無効] です。 表 2 に、ゾーンごとに設定できる値とその効果を示します。 図 4 は、レジストリ キーの値が既定の動作に設定されていることを示していますが、このキーは既定では存在しないため、通常は既定値とは異なる値に設定する場合にのみ作成します。
表 2 PromptingLevel レジストリ キー値の起動効果
Value | 信頼されていないルート機関 | 信頼されたルート証明機関によって発行された証明書 | 信頼されたルート証明機関と信頼された発行元証明書 |
---|---|---|---|
Enabled | 非フレンドリー ユーザー プロンプト | わかりやすいユーザー プロンプト | プロンプトなし。アクセス許可が付与され、アプリが起動する |
AuthenticodeRequired | アプリケーションが無効 | わかりやすいユーザー プロンプト | プロンプトなし。アクセス許可が付与され、アプリが起動する |
無効 | アプリケーションが無効 | アプリケーションが無効 | プロンプトなし。アクセス許可が付与され、アプリが起動する |
図 4: レジストリ キー値の入力を求めるユーザー
ClickOnce の信頼された発行元の動作
これをテストするには、開発用コンピューターで証明書を構成する必要があります。 最初の手順では、ClickOnce アプリの署名に使用する証明書を用意し、開発またはテスト コンピューター上の目的の証明書ストアでその証明書を構成します。 前述のように、最初にアプリケーションを発行する前に ClickOnce マニフェストの署名に使用する証明書を構成しない限り、Visual Studio は ClickOnce プロジェクトごとに新しい証明書を生成します。 新しいテスト証明書を生成し、それを既知の場所に保存してから、それを使用してすべての開発 ClickOnce プロジェクトに署名することをお勧めします。これにより、多数のテスト証明書で証明書ストアを散らばる必要はありません。 自動的に生成される証明書はパスワードで保護されていないため、パスワードで保護された証明書ファイルのみを使用することを強くお勧めします。
パスワードで保護された新しい証明書ファイルを Visual Studio 2005 で生成するには、プロジェクトのプロパティ ウィンドウに移動します (ソリューション エクスプローラーの [プロパティ] ノードをダブルクリックするか、プロジェクト ノードを右クリックしてコンテキスト メニューから [プロパティ] を選択します)。 [署名] タブを選択し、[ClickOnce マニフェストに署名する] チェック ボックスをチェックし、[テスト証明書の作成...] ボタンをクリックします (図 5 を参照)。 パスワードの入力を求めるメッセージが表示され、既定の名前の新しい pfx ファイルがプロジェクトに追加されます。 この証明書は、マニフェストの署名に使用される証明書としても設定され、Windows の個人用証明書ストアにインストールされます。 その後、[署名] タブの [ファイルから選択...] ボタンを押して、ファイルの名前を変更し、再利用可能な場所にコピーし、その証明書を任意のアプリケーションの証明書として構成できます。
図 5: 署名プロジェクトのプロパティ
証明書を取得し、[署名] プロジェクトのプロパティで ClickOnce マニフェストの署名に使用する証明書を特定したら、Visual Studio からアプリケーションを発行すると、マニフェストはその証明書で署名されます。 "実際の" 発行元証明書 (Verisign 証明書、または開発organizationが他の信頼されたルート機関によって署名を使用している証明書) がある場合は、代わりに、上記のファイルから、または署名プロジェクトのプロパティの [ストアから選択] ボタンを使用して、証明書の個人用ストア内の証明書をポイントして使用できます。
信頼された発行元の展開でユーザー プロンプトを回避する方法を確認するには、ClickOnce を使用してアプリを起動するコンピューターで発行元証明書を構成する必要があります。これは、多くの場合、最初の試行と開発の目的で開発マシンになります。 上記のように証明書を自分で生成した場合 (または Visual Studio に付属のmakecert.exeコマンドライン ユーティリティを使用している場合)、その証明書を信頼されたルート証明機関ストアに追加する必要があります。 これは、発行元だけでなく、証明書の発行者でもあるためです。 次に、同じ証明書を信頼された発行元ストアにインストールする必要もあります。これは、プロンプトを表示せずにアプリケーションを起動できるようにする最後の手順です。
これをすべて具体的にするために、数値で例をステップ実行してみましょう。 Visual Studio 2005 で新しい Windows アプリケーション プロジェクトを開始し、ClickOnceTrustedPub という名前を付けます。 プロジェクトが作成されたら、プロジェクト ノードの下にあるソリューション エクスプローラー ツリーの [プロパティ] ノードをダブルクリックしてプロジェクトのプロパティに移動し、[署名] タブを選択します。
次に、 ClickOnce マニフェストに署名するボックスを選択します。 [ テスト証明書の作成... ] ボタンを押し、証明書のパスワードを入力します。 プロジェクトに作成および追加されるファイルには、ClickOnceTrustedPub_TemporaryKey.pfx という名前が付けられます。 ソリューション エクスプローラーで devcert.pfx に名前を変更します。 また、ファイルをコンピューター上の一般的な開発フォルダーにコピーして、後続のプロジェクトで再利用し、証明書の再生成と構成を維持する必要がないようにすることをお勧めします。 証明書ファイルを作成するときに、Visual Studio によって証明書の個人用ストアにもインストールされます。
この証明書を信頼されたルート証明機関と信頼された発行元のストアに追加するには、[署名プロジェクトのプロパティ] タブの [ 詳細 ] ボタンをクリックします。これにより、証明書情報ダイアログが表示されます (図 6 を参照)。 [全般] タブの下部にある [証明書のインストール] ボタンをクリックすると、証明書のインポート ウィザードが表示されます。
図 6: [Certificate Information]\(証明書情報\) ダイアログ
ウィザードの 2 番目の手順で、ラジオ ボタンを選択して 次のストアにすべての証明書を配置し、[ 参照 ] ボタンを押します (図 7 を参照)。 これにより、証明書ストアの一覧から選択できるダイアログ ボックスが開きます (図 8 を参照)。
図 7: 証明書ウィザードのストアの選択
図 8: [証明書ストアの選択] ダイアログ ボックス
このプロセスを初めて行う場合は、 信頼されたルート証明機関 ストアを選択し、ウィザードで [ 次へ] をクリックし、[ 完了] をクリックします。 ルート証明機関証明書をインストールする危険性に関する詳細なセキュリティ警告ダイアログが表示されます。 [ はい ] をクリックするか、ClickOnce の信頼できる発行元の機能を試すことができませんが、説明されているリスクを理解していることを確認してください。 他のユーザーが証明書を取得し、それを使用してアプリケーションに署名し、コンピューター上で起動した場合、Windows はそのアプリケーションを、信頼された機関によって検証された会社によって発行されたものとして扱います。
[ 詳細 ] ボタンから説明されているプロセスを繰り返しますが、今度は同じ証明書を信頼された発行元ストアにインストールします。
これを完了したら、ClickOnce を使用してアプリケーションを発行できます。 これを行うには、Visual Studio の [ビルド] メニューから [ProjectName> の発行<] を選択し、ポップアップ表示されるウィザードで [完了] をクリックします。 これにより、アプリがビルドされ、既定の ClickOnce 発行設定で発行され、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 アプリケーションのブートストラップに追加できます。 ブートストラップの詳細については、MSDN Magazine の 2004 年 10 月号の「Visual Studio 2005 ブートストラップを使用してインストールをKick-Start する」を参照してください。
まとめ
ClickOnce セキュリティを使用すると、Code Access Security によって提供されるランタイム セキュリティ保護を利用しながら、アプリケーションが ClickOnce を介して配置される時点で特定のアプリケーションのアクセス許可を動的に決定できます。 ただし、この柔軟性は高い価格で提供されます。プロンプトを使用してアプリケーションのアクセス許可を昇格するユーザーをユーザーに許可するかどうか、および発行元証明書の発行元に基づいてプロンプトを表示するかどうかを決定する必要があります。 ClickOnce の既定の動作を理解するのが最も簡単です。 アプリケーションは信頼された発行元から展開されているため、そのアクセス許可を自動的に昇格させるか、発行元を信頼するかどうかをユーザーに決定するように求めるメッセージを表示します。 より制御された環境では、ユーザーのプロンプトを制限することが必要な場合があります。この記事では、PromptingLevel レジストリ キーを使用し、ユーザーのコンピューターで発行元と信頼されたルート証明機関証明書を構成する方法について説明しました。 ClickOnce のセキュリティ保護を適切に使用するには、さまざまな値の影響と、さまざまな証明書ストア構成での動作を理解することが重要です。
作成者について
Brian Noyes は、Microsoft MVP であり、IDesign, Inc. (www.idesign.net) の講演者、トレーナー、ライター、コンサルタントです。 TechEd US and 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開発に関する多数の記事を発表しています。 Addison-Wesley .NET 開発シリーズの一部である Windows フォーム 2.0 の最新のデータ バインディングは、2005 年の秋に棚にヒットします。 ブライアンは、海軍でF-14トムキャットを飛行中に脳を刺激するプログラミングを開始し、彼のスキルと関心をプログラミング航空機やアビオニクスシミュレーション、プロトタイプ、サポートアプリケーションに適用しながら、トップガンと米国海軍テストパイロットスクールに通う副腎を刺激しました。