Inno Setupでsigntool.exeを使ってコードサイニング証明をつける


Inno Setupとはフリーのカスタマイズ可能なインストーラー作成ツール

拙作のアタッシェケースでは、インストーラーとしてInno Setupを使用しています。フリーでありながら、さまざまなオプションによるカスタマイズが可能で、究極はPascalでスクリプトを書いて走らせることもできます。

その中で、できあがったインストーラーにコードサイニング証明書を付けるのは、バッチファイルなどで処理していますが、Inno Setup で作成したインストーラー内に含まれる「アンインストーラー」にも証明書を付けてやらねばなりません。


昔の Inno Setup では、インストーラーとして固められたバイナリから、無理くり抜き出してコードサイニング証明書を付加していたようですが、現在のバージョンではそのオプションがあり、容易に証明書を付けることができます。

バッチファイルからの signtool.exe は無理筋っぽくて、Inno Setup の IDE から登録するのが無難

ただし、Inno Setup で作成したインストーラー内の「アンインストーラー」に証明書を付けるには、Innno Setupの設定ファイル(*.iss)をバッチファイルから Inno Setup コンパイラ(ISCC.exe)に喰わせることで、証明書を付加することはできないようです。

そこも一箇所にまとめて自動化するには、Node.js のモジュールを入れれば、近いことができそうです。

node-innosetup-compiler
https://github.com/felicienfrancois/node-innosetup-compiler

おとなしくバッチファイルで処理する場合には、signtool.exe の引数込みのコマンドを Inno Setup の IDE 上から登録することで、処理することができるようになります。

IDE から signtool.exe の処理を追加する

登録するには、Inno Setup の IDE メニュー「Tools」→「Configure sign tools…」を選択します。

すると、Sign Tool を選択するためのウィンドウが出てきますので、「Add」を押して、Signtool.exe を登録していきましょう。

まず、登録する signtool.exe の内容を示す「変数名」を入力します。ここは、設定ファイル(*.iss)で必要になってきますが、分かりやすい適当な名前で良いでしょう。ここでは、仮に「MySignTool」という名前にしました。

名前を入力すると、続いてその内容を入力するウィンドウが表示されます。前のウィンドウと似てますので少し注意が必要です。

そこに、

$qC:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe$q sign /v /a /n $qMitsuhiro Hibara$q /t http://timestamp.comodoca.com/authenticode $f


といった感じに、signtool.exe のコマンドライン実行形式を丸ごと入力してOKボタンを押します。ここに書き込まれる、signtool.exe の書式などの扱いについては後述します。

リストに、MySignTool=$qC:\Program Files\Microsoft....と表示されていると思います。

ここで、「OK」ボタンを押せば、signtool.exe のコマンドライン実行形式は、先ほど名前を付けた「MySignTool」変数に入り、Inno Setup の設定ファイル(*.iss)で使うことができます。

次に、設定ファイル(*.iss)にある、「Setup」セクションに、以下の二つを追加します。

issSignedUninstaller=yes
SignTool=MySignTool

これで設定は完了です。

ちなみに、上で例として使われている Inno Setup の設定ファイルは、GitHubで見ることができます。

https://github.com/hibara/AttacheCase3/blob/master/installer/AttacheCase.iss

Inno Setup で使う signtool.exe コマンドオプションの書式

さて、Inno Setup の変数として登録した signtool.exe ですが、コマンドオプションなどの書式詳細は以下を参考にすると良いでしょう。

SignTool.exe (署名ツール) – Microsoft
https://docs.microsoft.com/ja-jp/dotnet/framework/tools/signtool-exe

あと、書式内で$qや、$fといった記号が用いられていますが、こちらは、Innno Setup のパラメーターオプションです。

ちなみに、ここで使われている、$q は、クォートを示し、$f は、Innno Setup が与えるファイルパスなどが入ります。

$qC:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe$q sign /v /a /n $qMitsuhiro Hibara$q /t http://timestamp.comodoca.com/authenticode $f

前述した signtool.exe のコマンドライン書式を振り返って観ましょう。コマンドオプション詳細については、以下のページにあります。

SignTool.exe (署名ツール) – Microsoft
https://docs.microsoft.com/ja-jp/dotnet/framework/tools/signtool-exe

ですが、ここで使われているオプションについては、補足しておきます。

  • /v コマンドライン処理いた歳に、コマンドが正常に実行したか、失敗したかにかかわらず、詳細出力と警告メッセージが表示されます。
  • /n コードサイニング証明書をつける人の名前(法人なら組織名を指定します。
    /n "Mitsuhiro Hibara"
  • /t タイム スタンプ サーバーの URL を指定します。これは、コードサイニング証明書を取得した場所によって指定がちがうため、入手先のヘルプページか何かを参考にされると良いでしょう。
  • /a 最適な署名証明書を自動的に選択します。もっとも有効期間が長い証明書が自動で選択されます。個人でアプリケーションを配布されている方などは、複数コードサイニング証明書を持っているとは思えませんし、一つで管理しているのなら開発環境のあるPC内にインストールして、このオプションを使うのが、もっとも簡単かと思います。

もしも複数のコードサイニング証明書を運用したいとき

もしも複数の証明書を運用したい場合は、Inno Setup の「Configure Sign Tools…」メニューから、複数の signtool.exe の書式を「変数」として登録できるので、ここで切り替えても良いでしょう。

なお、以下のように、直接、コードサイニング証明書ファイル(*.pfx)を指定してコードサイニングすることも可能です。

signtool.exe sign /f $qM:\cert\SectigoLimited.pfx$q /p $qpasswordpassword$q /n $qMitsuhiro Hibara$q /t http://timestamp.comodoca.com/authenticode $f

/f オプションで、pfxファイルへのパスを指定して、/pオプションで、その pfxファイルを作成した際に入力いたパスワード文字列を指定しても、アンインストーラーに署名をすることが可能になります。

Windows7 以降に対応する

拙作のアタッシェケースは、まだ XP, Vista などに対応しているため、タイムスタンプサーバーで使用されるダイジェストアルゴリズムは、セキュリティ的に脆弱性が指摘されている、SHA-1を使っておりますが、もし Wndiow7 以降のアプリケーションにコードサイニング証明書を付けるのなら、SHA-2(SHA-256)を使用する方が無難でしょう。

signtool.exe sign /a /fd SHA256 /v /tr http://timestamp.comodoca.com /td sha256 $f

以上です。


お気軽にコメントをどうぞ〜

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントフィード

s