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

EVコードサイン証明書での署名方法

 バイナリファイル(実行ファイル)を用意するところまでは通常のソフトウェア開発と同様である。実行ファイルを用意できたらsigntool.exeというツールを使って以下のような流れで署名作業(実行ファイルの改変)を行う。

図18 署名の流れ
図18 署名の流れ

 なお、ドライバ開発の場合はVisual Studioに証明書情報を登録してビルド時に署名も行う方法もある(後述)。

signtool.exeの実行方法

 signtool.exeはWindows SDKに含まれており、以下のURLなどから入手できる。

Windows 10 用 Windows ソフトウェア開発キット (Windows SDK)

 上記はWindows 10向けのSDKだがWindows 7などの環境でも動作する。またVisual StudioをフルインストールしていればWindows SDKもいっしょに導入されている。

 Windows SDKのデフォルトのインストールディレクトリは、

C:\Program Files (x86)\Windows Kits\10\bin\

である。このディレクトリ下のx64もしくはx86ディレクトリにsigntool.exeとして用意されている。

 signtool.exeを実行するには、コマンドプロンプトを開き、以下のように実行する。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" /?
Usage: signtool <command> [options]

        Valid commands:
                sign       --  Sign files using an embedded signature.
                timestamp  --  Timestamp previously-signed files.
                verify     --  Verify embedded or catalog signatures.
                catdb      --  Modify a catalog database.
                remove     --  Reduce the size of an embedded signed file.

For help on a specific command, enter "signtool <command> /?"

>

 signtool.exeへのパスはスペースが含まれているのでフルパスをダブルクオートで括って実行すればよい。

USBトークンの装着を忘れずに

 署名作業を行うにあたっては、USBトークンを忘れずに装着しておこう。ちなみにこのUSBトークンはアクセスがあると発光ダイオードが点滅するタイプなので、作業中にいつ証明書にアクセスしているのかわかりやすい。

写真2 USBトークンを装着
写真2 USBトークンを装着

通常ファイルへの署名実行

 signtool.exeコマンドのオプションにはさまざまなものが用意されているが、実行ファイルに署名する典型的なコマンドは以下のようになる(サンプルファイルとして圧縮・解凍ソフトの7-Zipのインストーラをファイル名を変更して使っている)。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /v /a /n "OSDN Corporation" /tr http://timestamp.globalsign.com/?signature=sha2 /td sha256 7z920-ev-sample.exe
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

Done Adding Additional Store
Successfully signed: 7z920-ev-sample.exe

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

>

 まず、署名を行う「sign」コマンドを記載し、「/a /n」オプションに続いてEVコードサイン証明書の名前を記載する。「/a」は自動で最適な証明書を選ぶオプションで指定しなくてもとくには問題ない。「/n」は利用する証明書の名前を指定するものである。

 続く文字列ではタイムスタンプ関連の指定を行っている。「/tr」オプションはRFC 3161のタイムスタンプサーバーのURLを指定するもので、グローバルサインのEVコードサイン証明書の場合は「?signature=sha2」を付けた上記のURLとなっている。「/td」オプションはタイムスタンプのアルゴリズムを指定するものでSHA-2のSHA2-256である「sha256」を指定する。

 それでは署名ができたか確認してみよう。確認には「verify」コマンドを使い、実行ファイル向けの検証を行う「/pa」オプションを指定する。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" verify /pa 7z920-ev-sample.exe
File: 7z920-ev-sample.exe
Index  Algorithm  Timestamp
========================================
0      sha1       RFC3161

Successfully verified: 7z920-ev-sample.exe

 正しく署名されていることは確認できるが、Algorithmは「sha1」(SHA-1)となっている。上記の署名コマンドではファイルダイジェストがSHA-1の署名となる。Windows Vistaやアップデートが行われていないWindows 7の場合、SHA-2のファイルダイジェストに対応していないため、それらのOSを考慮する場合はこのようにファイルダイジェストはSHA-1のままのほうが良い。

 ファイルダイジェストをSHA-1とする場合はタイムスタンプの署名は重要だ。「/tr」などのオプションを省けばタイムスタンプなしの署名が行えるが、SHA-1の場合は2015年末以前に署名されていることを証明する必要があり、タイムスタンプなしの署名は署名されていないものと同じ扱いになってしまう。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" verify /pa 7z920-timenone.exe
File: 7z920-timenone.exe
Index  Algorithm  Timestamp
========================================
0      sha1       None	                ←「None」となったらNG

Successfully verified: 7z920-timenone.exe

 今後タイムスタンプを省くという運用はないと思われるので、確認の際のコマンドではタイムスタンプがないことを警告する「/tw」オプションも利用しておくと良いだろう。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" verify /pa /tw 7z920-timenone.exe
File: 7z920-timenone.exe
Index  Algorithm  Timestamp
========================================
SignTool Warning: File is not timestamped: 7z920-timenone.exe
0      sha1       None

Successfully verified: 7z920-timenone.exe

Number of files successfully Verified: 1
Number of warnings: 1

SHA-2ファイルダイジェストでの署名実行

 Windows Vistaでの利用を考慮しなくて良い場合など、ファイルダイジェストをSHA-2と明示するには、「/fd」オプションを使い、アルゴリズムを明示する。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /v /a /n "OSDN Corporation" /tr http://timestamp.globalsign.com/?signature=sha2 /td sha256 /fd sha256 7z920-ev-sample2.exe
The following certificate was selected:
	:
	:

 verifyコマンドで確認すると、先ほどとは異なりSHA-2で署名されたことが確認できる。

>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" verify /pa 7z920-ev-sample2.exe
File: 7z920-ev-sample2.exe
Index  Algorithm  Timestamp
========================================
0      sha256     RFC3161

Successfully verified: 7z920-ev-sample2.exe

署名されたファイルを実行

 無事署名ができたところで、実際のOS環境で確認してみよう。Windows 10上で動作させたのが下図である。

図19 EVコードサイン証明書で署名された実行ファイル
図19 EVコードサイン証明書で署名された実行ファイル
図20 署名なしの実行ファイル
図20 署名なしの実行ファイル

 署名しているファイルでは青系のインフォメーションダイアログとなるが、署名なしだとオレンジをベースとしたアラートとなり、一般ユーザーにとっては導入しづらいものとなる。Windows 8などでも同様の配色である。