.NET TIPS ClickOnceのデジタル証明書を更新するには?[VS 2005のみ、2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦2007/06/28 2007/11/10、2007/12/20 更新 |
|
|
ClickOnce機能で配布されるアプリケーション(以降、ClickOnceアプリ)は、「コードサイニング証明書(Authenticode対応Digital ID)」(以下、デジタル証明書)によって署名されなければならない。この署名作業はVisual Studio 2005(以降、VS 2005)が自動的に行ってくれるため、あまり意識していない開発者も少なくないだろう。
このVS 2005による自動署名のほかにも、makecert.exeを使って手動で発行したデジタル証明書を使う方法や、第三者機関のVeriSignなどが発行したデジタル証明書を利用する方法などがある(詳しくは「連載:ClickOnceの真実 第7回」の「■セキュリティの設定方法1 ― デジタル証明書による署名方法」を参照されたい)。
しかし、いずれの方法で署名したとしても、そこで使われるデジタル証明書の有効期間は基本的に12カ月である。そのため、1年が過ぎてアプリケーションをバージョン・アップしようとすると、この有効期限に引っかかり、ClickOnce発行する際にエラーとなってしまうのだ。
次の画面は実際に有効期限が切れたデジタル証明書を使って発行しようとしたときの[エラー一覧]の表示である。
有効期限が切れたデジタル証明書で発行しようとしたときのエラー |
「The signer's certificate is not valid for signing.」のメッセージが、署名に使おうとしているデジタル証明書が(有効期限が切れているなどの理由で)不正であることを通知している。 |
このエラーを回避するには、デジタル証明書を更新して有効期限を延ばすしかない(※VS 2005でデジタル証明書を新たに作り直すと、「デジタル証明書が一致しない」というエラーになり、クライアントPCからClickOnceアプリをアップデートできないので注意すること。なお、読者からの問い合わせによると、VeriSignなどが発行した証明書を更新しても同様のエラーが発生することがある。筆者はVeriSignの証明書で動作を検証したわけでない)。
だが、VS 2005が自動生成したデジタル証明書(=「<プロジェクト名>_TemporaryKey.pfx」ファイル)の場合は、どうやって有効期限を延期すればよいのだろうか? これについて本稿で説明する。
VS 2005が自動生成したデジタル証明書を更新するには?
実はVS 2005には証明書を作成する機能はあるが、それを更新する機能は備えていない(※次期Visual Studio 2008(コード名:Orcas)では更新機能に対応するらしい)。そのため、VS 2005で自動署名している場合には、ClickOnceアプリをバージョン・アップ/更新できない問題には簡単に対応できない(※有効期限は署名時にチェックされるので、有効期限内に署名したClickOnceアプリであれば、期限失効後もそのまま利用できる。ここで問題となるのは新たなバージョンを開発・提供する場合である)。これに対し米Microsoftは、以下のKB(ナレッジ・ベース)を提供している。
これを読むと、1つの対応策は「すべてのクライアントでいったん既存のClickOnceアプリをアンインストールして、新しいデジタル証明書で署名したClickOnceアプリを再インストールすること」で、もう1つは「RenewCert.exeというコマンドライン・ツールを作り、それを使ってデジタル証明書を更新すること」と記述されている。前者の方法はクライアント数が増えてくると現実的な解決策ではなくなる。そこで本稿では、後者の方法を用いてデジタル証明書を更新する手順を紹介する。
取りあえず最初にRenewCert.exeを作成する必要がある。このツールは、Visual C ++を使用し、Win32コンソール・アプリケーションとして作成する。
●RenewCert.exeの作成手順
RenewCert.exeを作成するには、まずVS 2005(※Visual C++ 2005 Express EditionでもOK)のIDEを立ち上げ、メニュー・バーから[ファイル]−[新規作成]−[プロジェクト]を選択して[新しいプロジェクト]ダイアログを表示し、そこで「Visual C++」による「Win32 コンソール アプリケーション」のプロジェクトを「RenewCert」という名前で作成する。
次の画面は実際に[新しいプロジェクト]ダイアログで指定する内容である。
「RenewCert」プロジェクトの新規作成 | ||||||||||||
[新しいプロジェクト]ダイアログで「RenewCert」プロジェクトを作成しているところ。[場所]は任意のディレクトリを入力してよい。 | ||||||||||||
|
上記画面の手順を実行すると、次のような[Win32 アプリケーション ウィザード]ダイアログが表示されるので[完了]ボタンをクリックしてダイアログを閉じる。
[Win32 アプリケーション ウィザード]ダイアログにおけるプロジェクト設定 |
何も設定せずに[完了]ボタンをクリックしてウィザードを終了する。 |
以上の作業により、「RenewCert」プロジェクトが新規に作成される。
次に[ソリューション エクスプローラ]で(自動生成されている)「RenewCert.cpp」項目をダブルクリックしてRenewCert.cppファイルを開き、既存のコードを以下のコードに書き換える(※単純にコピー&ペーストでOK)。
なお下記のコードは、先ほどのMicorosoft サポートオンラインで示されているものであり、本稿でオリジナルに作成したものではない(※ただし、日本語の説明を追加したり、不要なコード部分はカットしたりするなど若干の改変を行っている)。
|
|
置き換えるコード内容(RenewCert.cppファイル) | |
コード内容の説明は本稿の趣旨ではないため割愛する。 |
さらにstdafx.hファイルを開き、既存のコードを以下のコードに書き換える。
|
|
置き換えるコード内容(stdafx.hファイル) | |
コード内容の説明は本稿の趣旨ではないため割愛する。 |
以上でコーディングは終了だ。
上記コードでは、(wincrypt.hヘッダ・ファイルをインクルードして)Crypt32.dllファイルの関数や構造体などを利用するので、次の画面のようにして、プロジェクトのプロパティで「Crypt32.lib」ライブラリをリンカの入力に指定する必要がある。
あとはソリューションをビルドすればRenewCert.exeファイルが生成される。
●RenewCert.exeの利用
RenewCert.exeの使い方は簡単だ。コマンドラインでの構文は以下のようになっている。
RenewCert.exe <元のデジタル証明書のファイル・パス名>.pfx <更新後のデジタル証明書のファイル・パス名>.pfx "CN=<発行者名>" <パスワード> |
VS 2005で自動生成したデジタル証明書における発行者名は、ClickOnceの発行を行ったユーザーの名前(例えば「D-ADVANTAGE\masa-i」)になっているはずだ。RenewCert.exeでもこの名前を指定すればよい。発行者の名前を変更したいのであれば、任意の名前を指定してもOKだ。
例えば筆者の環境では、以下のコマンドラインでデジタル証明書を更新できた(※パスワードは指定していない)。
renewcert C:\WindowsApplication1_TemporaryKey.pfx C:\WindowsApplication1_TemporaryKey_New.pfx "CN=D-ADVANTAGE\masa-i" |
これを実行すると、C:\にあるWindowsApplication1_TemporaryKey.pfxファイルが読み込まれ、新しくWindowsApplication1_TemporaryKey_New.pfxファイルが生成された(※元のファイルは書き換えられない)。
最後に実際にVS 2005を使って、この新しいデジタル証明書(.pfxファイル)を利用するようにすれば、冒頭で示したようなエラーが表示されずにClickOnceの発行が成功するはずである。VS 2005でデジタル証明書を指定する方法は、先ほども示した「連載:ClickOnceの真実 第7回」の「■セキュリティの設定方法1 ― デジタル証明書による署名方法」を参考にしてほしい。
RenewCert.exeでデジタル証明書を更新すると、有効期限は5年延長されるので、当分の間はデジタル証明書の更新で作業が発生することはないだろう。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Windowsフォーム 処理対象:ClickOnce |
|
「.NET TIPS」 |
更新履歴 | |||||||
|
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|