準備OK? EVコードサイニング証明書の現状とその実際 3ページ
EVコードサイン証明書での署名方法
バイナリファイル(実行ファイル)を用意するところまでは通常のソフトウェア開発と同様である。実行ファイルを用意できたらsigntool.exeというツールを使って以下のような流れで署名作業(実行ファイルの改変)を行う。
なお、ドライバ開発の場合は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トークンはアクセスがあると発光ダイオードが点滅するタイプなので、作業中にいつ証明書にアクセスしているのかわかりやすい。
通常ファイルへの署名実行
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上で動作させたのが下図である。
署名しているファイルでは青系のインフォメーションダイアログとなるが、署名なしだとオレンジをベースとしたアラートとなり、一般ユーザーにとっては導入しづらいものとなる。Windows 8などでも同様の配色である。