さて、少々前置きが長くなってしまいましたが、ここからはVisual Studio 2012によるテスト署名の方法について説明します。
Visual Studio 2012上では、以下の流れでテスト署名を行います。
今回は、MSDNのコードレシピ集からダウンロードしたWindows 8 Driver Samplesの中から、シリアルドライバのサンプル(Serial Sample)を使用して、実際にビルド時のテスト署名の例を紹介していきます。
Visual Studio 2012で、上記のサンプルプロジェクトを開きます。ソリューションエクスプローラを見ると、以下の2つのプロジェクトが存在していることが分かります(図4)。
パッケージ用プロジェクトとは、デバイスドライバのインストールに必要なファイル(ドライバ本体、infファイルなど)をまとめて、それらに対してプロパティ上から設定(署名の設定やメタファイルの設定)をするためのプロジェクトのことを指します。
CATファイル自動生成の有効化は、パッケージ用プロジェクトのプロパティ設定で行います。
パッケージ用プロジェクトをマウスで右クリックし、プロパティページを表示させ、画面左にある[構成プロパティ]のツリーから[Inf2Cat]―[General]を選択し、画面右に表示された「Run Inf2Cat」の項目を「はい」にします(図5)。Inf2Catとは、カタログファイル生成のためのツールのことです。
ついでにもう1つ、知っておいた方がよい情報をご紹介します。[Inf2Cat]―[General]を選択すると、一番下に「Use Local Time」という項目があるのが分かります。デフォルトでは何も設定されていません(空白になっています)が、ここを、[はい(/uselocaltime)]にしておくことを推奨します。
ドライバのビルド時には、infファイルの[Version]に指定されている日付が、標準時(UTC)と比較しておかしな値ではないか、つまり、UTCでの日付に比べて、infの日付が未来や極端に過去の日付になっていないかをチェックします。
[StampInf]のプロパティで、[Enable DataStamp]を有効にしている場合は、infファイルの[Version]の日付を自動的に現在の日付に更新してくれますが、日本時間はUTCより9時間進んでいますので、ビルドのタイミングによっては、日本時間がUTCの日付より1日先になってしまい、“エラー”と判断されてしまう場合があります。
特に、納期に追われ、ドライバをビルドする時間が夜中に……というタイミングで、この“ワナ”に遭遇すると非常に焦ります。そのような時間帯にデフォルト設定のままドライバをビルドすると、以下のような意味不明なエラーが発生します。
Errors: 22.9.7: DriverVer set to incorrect date (postdated DriverVer not allowed) in \serial.inf. The current date (UTC) is 7/19/2013.
筆者も、過去に初めてこのエラーに遭遇した際、対処方法が分からずに、PCの日付設定でタイムゾーンを米国にする荒業(1?)で対応しました。一応、これでエラーは表示されなくなりましたが、「Visual Studioでドライバをビルドする際、毎回PCの時間設定をわざわざ米国に変更する必要があるのか……。なんという仕様だ!」と嘆いていたことがあります。もちろん、そのようなおかしな対処をしなくても、上記で紹介した通りの設定で回避可能です。
テスト署名の有効化も、パッケージ用プロジェクトのプロパティ設定で行います。
パッケージ用プロジェクトをマウスで右クリックし、プロパティページを表示させ、画面左にある[構成プロパティ]のツリーから[Driver Signing]―[General]を選択し、画面右に表示された「Sing Mode」の項目を「Test Sign」にします(図7)。
リリース用にAuthenticode署名を行う場合は、「Sing Mode」の項目で「Product Sign」を選択し、「Production Certificate」の項目で、証明書(.pfx)のパスを指定してください。
上記で行った2つの設定は、デバイスドライバのビルド時に反映されます。それでは、実際にビルドを行い、ビルド時のログを確認してみましょう(図8)。
ログを見てみると、ビルド後にInf2CatとDriverTestSignが実行されたことが分かります。これらはそれぞれCATファイル自動生成、テスト署名が実行されていることを表します。
なお、ドライバパッケージ(ドライバ本体、infファイルなど)に含まれるコンポーネントのどれか1つでも変更された場合には、署名をやり直す必要があります。
開発途中のドライバでは、「ドライバ修正 ⇒ 動作確認」という作業を繰り返すかと思いますが、当然ドライバ修正の度に“署名のやり直し”が必要になります。そのため、署名をドライバのビルドと同じタイミングで実施できるという点は、非常に便利だといえます。
上記の手順でテスト署名を行ったドライバは、テストモードで起動したOS上で正常にインストールして動作させることが可能です。
ドライバの署名検証のためには、テストPCをテストモードで起動することに加えて、PCにテスト証明書をインストールする必要があります(Windows 8では、証明書のインストールがないと、テストモードで起動してもドライバのインストールに失敗しますので注意してください)。
テスト証明書は、ドライバのビルド時に自動で作成されます(今回のSerial Sampleの場合はpackage.cerが作成されます)ので、そちらをテスト対象のPCにインストールしてください。
さて今回は、Windows 8の開発環境と、64bit OS対応のドライバ開発で必須となるデジタル署名について説明しました。次回は、Visual Studio 2012で使用できる解析ツールや、テスト自動化ツールなどを紹介します。お楽しみに! (次回に続く)
今回の寄稿に当たり、記述のチェック、およびアドバイスをしていただいた、サイエンスパークの川出智幸氏、原仁俊氏に感謝致します。
Copyright © ITmedia, Inc. All Rights Reserved.