ドライバーの Authenticode 署名の方法
こんにちは、JSです。今回は、ドライバー署名の方法について少しお話をしたいと思います。
大半のドライバーは、OS を支える機能などが動いている「カーネルモード」で動作しているので、OS に大きな影響を与える可能性があります。そのような事態を防ぐために、ドライバーが安全なものであるという信頼を示す方法として署名という仕組みを取り入れています。署名はドライバーをインストールする上で必要不可欠なので、このブログ内でも何度か署名について話してきました。まさかたさんのエントリ「ドライバーのデジタル署名の基礎」や、なおきお~さんのエントリ「ドライバーのデジタル署名の留意点」等を読めば署名の役割を理解できるかと思われます。しかし、実際ドライバーに署名をどう加えるのかについては詳しくご案内する機会がなかったので、今回は Authenticode 署名を例として使って、ドライバーに署名する手順を、注意点も含めてご紹介したいと思います。
Authenticode 署名までの手順を大きく分けると、以下の 5 つのステップになります。
1. 署名用のプログラムをインストール
2. 商用の認証局から、Authenticode 署名用の証明書を取得
3. 関連するクロス証明書をダウンロード
4. カタログファイルの作成
5. カタログファイルに署名
では、これからそれぞれの手順について説明いたします。ちなみに、今回 私は Windows 8.1 x64 環境を使用しています。
1. 署名用のプログラムをインストール
署名するためには、Windows Driver Kit (WDK) が必要になります。Windows 8 以降に対応するためには、Visual Studio 2013 がインストールされた環境への Windows Driver Kit 8.1 Update のインストールが必要となります。以下のサイトにある 「WDK 8.1 Update (Windows 8.1、8、7 ドライバー用)」 の項目から WDK をダウンロードしましょう。
Windows 8.1: キットとツールのダウンロード
<https://msdn.microsoft.com/ja-jp/windows/hardware/gg454513>
インストールが完了したら、「VS2013 の開発者コマンドプロンプト (Developer Command Prompt for VS2013)」を管理者権限で起動します。なお、Visual Studio 2013 をデフォルトのパスにインストールした場合、スタート画面から、アプリ一覧の [Visual Studio 2013] にある [Visual Studio ツール] をクリックすることで、C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts のフォルダが開き、そこから起動ができます。
以降の手順で実行するコマンドは、このコマンドプロンプト上で実行します。
2. 商用の認証局から、Authenticode 署名用の証明書を取得
2-1. CA からの証明書の取得
署名を行うにあたって、その署名が信頼に値するものだと示す証明書が必要になります。その証明書の取得ですが、証明書を提供している認証局 (Certification Authority、CA) から購入します。 どの CA から取得可能かについては、以下の MSDN サイトに一覧として記載されていますので、ご参照ください。
Microsoft Root Certificate Program Members
<https://msdn.microsoft.com/en-us/library/ms995347.aspx>
今回は、Authenticode 署名用の証明書を使用したいので、 「コード署名 (Code Signing)」 の欄を基にご検討いただけたらと思います。
2-2. 証明書の秘密キーのインストール
CA の指示に従った後に、署名に必要なファイル一式を取得します。それを 手順 1 でインストールした WDK が含まれているコンピュータにインストールしてみましょう。
CA からは、証明書の他に、 「秘密キー」 というものが提供されています。この秘密キーですが、使用する為には、Personal Information Exchange (.pfx) ファイルに格納されている必要があります。この .pfx ファイルは、デジタル証明書の他に、その証明書に関連付けられた公開キーと秘密キーも合わせて入っています。
.pfx ファイルをそのまま提供する CA もありますが、一部の CA は、Private Key (.pvk) という、秘密キーのみ含まれた形式のファイルを提供しています。その場合は、その .pvk ファイルと、同じく CA からもらった 証明書ファイル (.spc または .cer ファイル) を使用して、公開キーを格納します。具体例としては、VeriSign Class-3 証明書は現在、.pvk ファイルと .spc ファイルのペアとしてパッケージになっています。
その場合、証明書をコード署名に使用する前に、.pvk ファイルと .spc ファイルを、.pfx 形式に変換します。変換には、WDK の pvk2pfx.exeというコマンドラインツールを使います。ちなみに、pvk2pfx.exe は、デフォルトのパスに WDK をインストールした場合、C:\Program Files (x86)\Windows Kits\8.1\bin\x86 にあります。
下記の例では、.pvk ファイル (abc.pvk) と .spc ファイル (abc.spc) を、.pfx ファイル (abc.pfx) に変換します。
pvk2pfx -pvk abc.pvk -pi <pvkファイルのパスワード> -spc abc.spc -pfx abc.pfx -po <pfxファイルのパスワード> -f |
それぞれのオプションの詳細については、以下のサイトをご参照ください。
Pvk2Pfx
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff550672(v=vs.85).aspx>
2-3. 証明書のインポート
次に、秘密キーが含まれた .pfx ファイルを、コンピュータのローカルの [個人] 証明書ストアに格納する必要があります。先ほど手に入れた .pfx ファイルをダブルクリックすると、証明書のインポート ウィザードが開きますので、以下の手順に従って、証明書を [個人] 証明書ストアにインポートしましょう。
1. ウィザードの開始画面で [ ローカル コンピューター] を選択し、 [次へ] をクリックします。ユーザー アカウント制御のダイアログが現れる場合、 [ はい ] をクリックします。
2. インポートに使用する .pfx ファイルを参照します。「ファイル名」欄に指定のファイルのパスを入力する必要がありますが、ファイルをダブルクリックしてウィザードを起動した場合、自動的にそのファイルパスが欄に埋められているので、そのまま [ 次へ ] をクリックしましょう。
3. パスワードの入力を求められるので、.pfx ファイルのパスワードを入力し、 [ 次へ ] をクリックします。なお、今後 この証明書をストアから証明書ファイルとして取り出したい場合は、「インポートオプション」内の [このキーをエクスポート可能にする] にチェックを入れてください。
エクスポート方法の手順については、以下のドキュメントに記載されています。
証明書をエクスポートする
<https://msdn.microsoft.com/ja-jp/library/cc730988.aspx>
4. 証明書の配置場所を選択します。今回は、[個人] 証明書ストア内に配置したいので、 [証明書をすべて次のストアに配置する] オプションを選んで、配置場所を指定します。 [参照…] ボタンをクリックするとダイアログが現れるので、「個人」フォルダを選択して [OK] をクリックした後、 [次へ] をクリックします。
5. 最後に完了画面が現れるので、設定内容を確認した後、 [ 完了 ] をクリックします。これにより、証明書と秘密キーは、後述の手順で使用できるようになります。
2-4. 証明書のプロパティを表示する
後にこの証明書を使って署名を行うのですが、署名をする為に、証明書内の情報を確認する必要があります。システムの MMC スナップイン (Certmgr.msc) を使用して、[個人] 証明書ストア内にインポートした証明書を表示しましょう。
証明書情報の確認手順は以下の通りです。
1. 検索チャームから 「 certmgr.msc 」 と入力した後、Enter キーを押して、証明書 スナップインを起動します。
2. スナップインの左側ウィンドウで、 [個人] > [証明書] フォルダを選択し、署名に使用する証明書をダブルクリックします。
3. 証明書ダイアログ ボックスの [詳細] タブで、フィールドの一覧から [サブジェクト] を選択し、証明書のサブジェクト名を強調表示します。このサブジェクト名を、手順 5 の「カタログファイルに署名」にて使いますので、メモをしておきましょう。
3. 関連するクロス証明書をダウンロード
証明書には、証明書チェーンが含まれています。今回 ドライバーのインストールに使うカタログファイルの署名には、証明書チェーンに"Microsoft Code Verification Root"が含まれている必要があります。証明書チェーンの詳細については以下ドキュメントをご参照ください。
Certificate Chain
<https://msdn.microsoft.com/en-us/library/windows/desktop/bb540794(v=vs.85).aspx>
各 CA のルート証明は、"Microsoft Code Verification Root" と関連づけられていますが、CA から発行された証明書のチェーン自体には、その "Microsoft Code Verification Root" は含まれていません。なので、クロス証明書を使用して、"Microsoft Code Verification Root"とのチェーンを証明する必要があります。
ククロス証明書の取得については、下記のドキュメント内にて、適切な証明書の選択方法が記載されているほか、各 CA 用クロス証明書のダウンロードリンクもあります。ちなみに、ドキュメントからダウンロード可能な zip ファイルを解凍すると、.cer ファイルが展開されます。このファイルは、2-4 にて入手したサブジェクト名と同じく、手順 5 の「カタログファイルに署名」にて使います。
カーネル モードのコード署名用クロス証明書
<https://msdn.microsoft.com/ja-jp/library/windows/hardware/gg487315.aspx>
なお、ドキュメントからの抜粋とはなりますが、証明書の選択方法を画像付きで改めて以下にご案内します。
1. 検索チャームから 「mmc」 と入力した後、Enter キーを押して、以下に画像として表示されている Windows 管理ツールを起動します。
2. [ ファイル] メニューから [スナップインの追加と削除] を選択します。ウィンドウが表示されるので、 [証明書] スナップインを選択し、 [追加] をクリックすることでダイアログが表示されます。 [ユーザー アカウント] を選択し、 [完了] をクリックします。
[ 証明書] スナップインを再び選択し、 [追加] をクリックします。先ほどと同じダイアログが現れるので、 [コンピューター アカウント] を選択し、 [次へ] をクリックした後、 [ローカル コンピューター] を選択し、最後に [完了] をクリックします。最終的には以下のような画像になります。
3. 該当する証明書を証明書ストアで見つけて、ダブルクリックします。証明書は、インストール方法に応じて、下記の 2 つの場所のいずれかに表示されています:
1) 現在のユーザー\個人\証明書
2) ローカル コンピューター\個人\証明書
4. 証明書ダイアログ ボックスで、 [証明のパス] タブをクリックして、証明のパスの最上部の認証局を選択します。これが、証明書のルート認証局である CA です。
5. [ 証明書の表示] ボタンをクリックしてルート認証局の証明書を表示し、新しい証明書ダイアログ ボックスの [詳細] タブをクリックすると、証明書の [発行者] および [拇印] が表示されます。この CA に対応する項目を上記 URL にある一覧で見つけます。そこで、CA に関連するクロス証明書をダウンロードし、デジタル署名するときにこのクロス証明書を CA の証明書と共に使用します。
4. カタログ ファイルの作成
4-1. ドライバーパッケージフォルダーの作成
まずは、INF ファイルを含んだドライバーパッケージを、パッケージ用のフォルダーに入れましょう。ちなみに、パッケージと無関係なフォルダーが含まれているディレクトリ内 (C:\ 等) に .sys 等のパッケージ内ファイルを配置すると、カタログファイルの作成時にエラーが発生する可能性がある為、必要なファイルだけを含むフォルダを作ることをお勧めします。
4-2. パッケージフォルダー内の INF ファイルからカタログ ファイルを作成
Inf2Cat.exe というコマンドラインツールを使用して、INF が存在するプロジェクト用のカタログ ファイルを作成します。先ほど使用した pvk2pfx と同じく、デフォルトの場合は C:\Program Files (x86)\Windows Kits\8.1\bin\x86 に Inf2Cat.exe があります。ちなみに、Inf2Cat が作成するカタログ ファイルの名前は、パッケージの INF ファイル内で、 [Version] セクションの CatalogFile エントリにて指定されたものが適用されます。
Inf2Cat
を使用してカタログ ファイルを作成するには、現在のディレクトリを、未署名のドライバーパッケージの場所に設定し、下記の通り、コマンドラインを実行して、カタログ ファイルを作成します。この例では、ドライバーパッケージフォルダーを C:\Package とした場合に、Windows 8.1 x64 と Windows 8.1 x86 を対象 OS として指定してカタログファイルを作成しています。
Inf2cat.exe /driver:C:\Package\ /os:6_3_X64,6_3_X86 |
なお、上記の /os オプションにて指定する対象 OS の表記方法や、Inf2Cat で使用できるその他のコマンドの詳細については、下記ドキュメントをご参照ください。
Inf2Cat
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff547089(v=vs.85).aspx>
Using Inf2Cat to Create a Catalog File
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff553618(v=vs.85).aspx>
5. カタログ ファイルに署名
最後に、SignTool.exeと呼ばれるコマンドラインツールを使用し、以下のコマンドを実行することで、カタログファイルに署名をします。これで遂に、ドライバー署名が完了となります。
Signtool sign /v /ac <手順 3 のクロス証明書の .cer ファイル> /s my /n <手順 2-4 の [サブジェクト]> /t https://timestamp.verisign.com/scripts/timestamp.dll <手順 4 のカタログファイルである .cat ファイル> |
なお、上記にて使用したオプションについて、幾つか補足を加えます:
· "/s my" によって、[個人] 証明書ストアであることを指定します。
· "/t https://timestamp.verisign.com/scripts/timestamp.dll" によって、署名にタイムスタンプを追加します。
· "/n" オプションで、以前取得したサブジェクト名を参照します。
SignTool は、署名以外のコマンドもいくつかありますので、ご興味のある方は以下のドキュメントをご参照ください。
SignTool
https://msdn.microsoft.com/en-us/library/windows/hardware/ff551778(v=vs.85).aspx
ちなみに、署名ができたことの確認は、以下のコマンドで出来ます。
Signtool verify /pa <手順 4 のカタログファイルである .cat ファイル> |
以上、長い説明となりましたが、こちらがドライバーをインストールするために必要となる Authenticode 署名を行う方法です。ご覧の通り、数々のファイルやツールを使用しているので、署名を初めて行われる方にとっては全体像をイメージするのが難しいかもしれません。今回の案内が、署名のやり方に困っている方にとって、少しでもお役に立てるものになれたら幸いです。