準備OK? EVコードサイニング証明書の現状とその実際 4ページ

Windows 8以前のドライバなどカーネルモード向けの署名

 ドライバなどカーネルモードで動作するファイル向けの署名は一般ファイルへの署名と少々異なる。カーネルモードでの認証は、認証に用いるルート証明書が「Microsoft Code Verification Root」となり、署名にあたってはMicrosoft Code Verification Rootからの認証局にあわせたクロス証明書をMicrosoftのWebサイトからダウンロードして利用することになる。また、クロス証明書と自身の証明書をつなぐ中間証明書も必要な場合がある。

 より具体的には、グローバルサインの場合は以下のような証明書チェーン(階層)となる。

Microsoft Code Verification Root
	GlobalSign Root CA(MicrosoftのWebサイトからダウンロード)
		GlobalSign(グローバルサインのサイトからダウンロード)
			GlobalSign Extended Validation CodeSigning CA - SHA256 - G2
				自分の証明書

・GlobalSign Root CA
http://download.microsoft.com/download/2/4/E/24E730E6-C012-448F-92B6-78744D3B77E1/GlobalSign%20Root%20CA.zip ・グローバルサインの中間証明書
https://jp.globalsign.com/support/docs/r1cross.cer

 署名作業にあたって、中間証明書はあらかじめ作業するWindowsに導入しておく。r1cross.cerをダブルクリックすると下図のような画面になるので、下部にある「証明書をインストール」を押し、ウィザードに従って導入できる。

図21 中間証明書r1cross.cerの導入
図21 中間証明書r1cross.cerの導入

 クロス証明書である「GlobalSign Root CA.crt」は作業ディレクトリ直下かパスが入力しやすいディレクトリに置いておくのが良い。

 カーネルモード用の署名コマンドは以下のようになる(ramdisk.sysに署名した例)。ポイントはクロス証明書を「/ac」オプションで指定するところである。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /ac "GlobalSign Root CA.crt" /a /v /n "OSDN Corporation" /tr http://timestamp.globalsign.com/?signature=sha2 /td sha256 /fd sha256 ramdisk.sys
The following certificate was selected:
    Issued to: OSDN Corporation
    Issued by: GlobalSign Extended Validation CodeSigning CA - SHA256 - G2
    Expires:   Fri Apr 22 16:42:49 2016
    SHA1 hash: 5232214B71344415ED886445894C30A3E0C9A52F

Cross certificate chain (using user store):
    Issued to: Microsoft Code Verification Root
    Issued by: Microsoft Code Verification Root
    Expires:   Sat Nov 01 22:54:03 2025
    SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3

	:
	:

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

 実行時のメッセージには、上記に示したような証明書のチェーンも表示される。

カーネルモード用の署名確認

 カーネルモード用の署名確認は、前述の「/pa」ではなく「/kp」オプションを使う点に注意が必要だ。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" verify /kp ramdisk.sys
File: ramdisk.sys
Index  Algorithm  Timestamp
========================================
0      sha256     RFC3161

Successfully verified: ramdisk.sys

Visual Studioのドライバ開発における証明書設定

 Visual Studioではドライバプロジェクトのプロパティにおいて証明書設定が行えるので、signtool.exeを使わずにビルド時に署名作業も行うことが可能だ。具体的にはパッケージもしくはドライバ本体のプロジェクトのプロパティから、「Driver Singing」(もしくはその翻訳文字列)のメニューを選択すると下図のような画面になる。

図22 Visual Studioにおける証明書設定
図22 Visual Studioにおける証明書設定

 「Sign Mode」には、正規の証明書で署名する「Productin Sign」のほか、「Test Sign」、「Off」が選択できる。「Productin Sign」を設定したら、そのほかの項目にて、クロス証明書や自分のEVコードサイン証明書、タイムスタンプサーバーの認証局、ファイルダイジェストのパラメータ(/fdオプションに相当)などを設定していく。

 EVコードサイン証明書を指定する場合、証明書はUSBメモリ内にあって証明書ファイルの実体はないので、指定方法に躊躇してしまいそうになるが、「Production Certificate」の項目をプルダウンすると、証明書ストア(Select from Store)の項目があり、これを選択すればUSBメモリのEVコードサイン証明書を選択できる。その際、証明書の入ったUSBメモリを挿入していないと証明書ストアは空になっているので注意が必要だ。

 上記のように設定できていれば、ビルド時にドライバ本体やドライバのカタログ(cat)ファイルに対して署名作業が行われ、下図のようにビルド中の署名作業の都度、パスワード入力のポップアップが表示され、署名されたドライバファイルが作成できる。

図23 ビルド時にパスワード入力画面がポップアップする
図23 ビルド時にパスワード入力画面がポップアップする

Windows 10向けカーネルモードドライバの署名方法

 Microsoftに申請して署名してもらう、新しく追加された署名方法を実施するには、あらかじめいくつかの手続きが必要になる。その準備が終われば、ドライバファイルをサイトにアップロードし、署名されたファイルをダウンロードして利用するという流れになる。

ハードウェアデベロッパーセンターでの準備

 ユーザーは、ハードウェアデベロッパーセンターにEVコードサイン証明書と企業名の登録を行ってアカウントを開設し、その後Microsoftとの契約を交わす必要がある。一連の作業の流れは以下のようになる。

  1. ハードウェアデベロッパーセンターにMicrosoft accountでログイン
  2. 右上の「ダッシュボード」をクリック
  3. 既存の企業登録がない場合は、Create a Company Accountの項目内のNextボタンをクリック
  4. 署名用の実行ファイルwinqual.exeをダウンロード
  5. winqual.exeに前述のsigntool.exeを使ってEVコードサイン証明書で署名
  6. 念のためwinqual.exeを実行して署名を確認
  7. winqual.exeをサイトにアップロード
  8. 企業情報を登録
  9. 企業アカウントの開設完了
  10. アカウントの役割(署名作業を行えるか、契約を交わせるかなど)を設定する(許可する)
  11. Microsoftと、証明書の扱いやクオリティ保証など複数の電子契約交わす
  12. 交わした契約によってハードウェアデベロッパーセンターの各機能が有効になる
図24 ハードウェアデベロッパーセンター
図24 ハードウェアデベロッパーセンター(https://msdn.microsoft.com/ja-JP/windows/hardware/)

 作業は基本的に英語の画面で進む。2015年10月時点では以前の画面からアップデートされていない内容もあるが、それぞれの手順はサイト上に記載され基本的にはウィザード形式で進んでいくので、注意深く読み進めていけば問題はないだろう。サイトに用意されている各機能は契約を交わすことで有効になる。契約書類は多数用意されているが、カーネルモードドライバの署名に最低限必要なのは数種類である。なお、契約書への電子署名の際はInternet Explorerで作業したほうが無難である。

 winqual.exeへの署名コマンド例は以下のようになる。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /v /n "OSDN Corporation" /tr http://timestamp.globalsign.com/?signature=sha2 /td sha256 /fd sha256 winqual.exe

 winqual.exeは自己検証プログラムにもなっており、このファイルを実行することで、署名されているかどうかを確認できる。

図25 署名されたwinqual.exeを実行した場合の例
図25 署名されたwinqual.exeを実行した場合の例

カーネルモードドライバの署名フロー

 必要な契約を交わせば、署名申請の機能が有効になる。認定プログラムではない、署名申請だけを行う項目は「File signing services」にある「Create diver signing submission」のところである。

図26 Create diver signing submission
図26 Create diver signing submission

 署名までの作業の流れをまとめると以下のようになる。

  1. 署名なしのドライバを作成
  2. ドライバファイル群をcabファイルに階層パッケージ化する
  3. cabファイルに対して登録したEVコードサイン証明書で署名
  4. cabファイルをCreate diver signing submissionの画面でアップロード
  5. ウイルスチェックなど10項目ほどの検証が行われる
  6. しばらくして検証が無事パスすると「This submission has passed review.」とメールが送付され、署名されたファイルがダウンロード可能になる
  7. Windows 10で実行可能なMicrosoftの署名付きファイルをダウンロードする

 ポイントはドライバ作成のときに署名が必要ないことと、提出時のcabファイル作成でファイル群をディレクトリに収めることである。

 たとえば、ドライバファイル群としてカレントディレクトリ下に、

osdnramdisk\kmdfsamples.cat
osdnramdisk\ramdisk.inf
osdnramdisk\ramdisk.sys

のような3ファイルがあった場合、以下のようなサブディレクトリ指定のファイルリストをfilelist.txtとして作成する。

.Set DestinationDir="osdnramdik"
osdnramdisk\kmdfsamples.cat
osdnramdisk\ramdisk.inf
osdnramdisk\ramdisk.sys

 そしてcabファイル作成時には、以下のようなコマンドを実行する。

> makecab /F filelist.txt /D MaxDiskSize=1024000

 これでディレクトリ付で各ファイルがDisk1以下の1.cabファイルに格納される。

 「Create diver signing submission」の画面では、この作成した1.cabをアップロードすればよい。もしディレクトリにまとめないでアップロードしてしまうと、Hardware Certification KitおよびHardware Lab Kitの検証フェーズでエラーとなってしまう。単純なミスの割に認定エラーと表示されて戸惑うことになるので注意しておきたいポイントである。

 無事署名が終わると、「Manage submissions」のメニューから該当申請のページを開くと、署名されたドライバファイルがZIPファイルとしてダウンロードできる。上記のようなファイル構成の場合、catファイルとsysファイルに対してMicrosoftの署名がなされた状態になっている。

図27 ハードウェアデベロッパーセンターによる署名
図27 ハードウェアデベロッパーセンターによる署名

 以上で、Windows 10において導入時および実行時にブロックされることなく、カーネルモードドライバが利用可能になる。

EVコードサイン証明書の利用は流れを把握できれば難しくはない

 SSL証明書は利用例も多く、ドキュメントも豊富なので利用にあたっての心理障壁は高くないが、コードサイン証明書は障壁が高くなりがちかもしれない。とくにEVコードサイン証明書となるとドキュメント類は少なく、堅牢性が増している分だけ面倒な場面もあったりする。しかし、取得と利用の基本の流れがわかってしまえば、作業自体は単純なものである。本稿を眺めて流れをつかんでいただき、EVコードサイン証明書の導入に役立てていただければ幸いである。