2024年12月29日日曜日

VisualStudio Installer プロジェクトでコードサイン証明書を適用する

pfx形式が使えなくなった

製品のインストーラ(exe形式ファイル)を作成するために、これまで頑なに Install Shield 2015 の無料版を使用していましたが。
コードサイン証明書が変更になってしまい、pfx形式だとうまくビルドできなくなってしまいました。
そこで、VisualStudio 2022 の Installer プロジェクトを新たに作成することにしました。

ビルドしたインストーラファイル(msi形式ファイル)にコードサイン証明書を適用する必要があるのですが、その手順を自動化したので紹介します。

USBドングルでの証明書

これまでは、コードサイン証明書は .csr 形式のファイルで提供されていて、そいつを元に .pfx 形式ファイルを作成していました。
インストーラプロジェクトでは、sign タブの部分で pfx ファイルとパスワードを設定さえすればビルドできてたんですよね・・・
Visual Studio 2015の Install Shield では、ストアに登録した新しいコードサイン証明書を指定しても、エラーになってビルドできませんでした。

Installer Project を作成する

VisualStudio 2022 の Installer プロジェクトを作ります。
プロジェクトのプロパティで必要事項を設定するのですが、設定項目が Install Shield とほぼ同じのため、さほど混乱はしませんでした。
重要場部分としては、次のような点でしょうか。

  1. ProductCode はバージョン番号を変えたら必ず新しいものに変更する。
  2. UpgradeCode は変更してはならない。(そうしないとインストール時に以前のバージョンをアンインストールしてくれなくなります)
  3. ProductName 部分はインストール先のフォルダ名に利用される点に注意
  4. Version は##.##.####形式でなければならない
これまでバージョン番号には ##.##.##.## の形式だったのが使えなくなりました。
後述のアンインストールしてくれない問題は、ここが原因なのかもしれません。

signtool.exe を使ってコードサイン証明書を適用

無事インストーラが出来上がったら、コードサイン証明書を適用します。
signtool.exe の GUI で使用するのですが、入力項目が多く、とっても面倒でした。
ということで、インストーラプロジェクトの PostBuildEvent に次の行を追加して自動化しました。

signtool sign /a /n "証明書のトークン名" /t "タイムスタンプサーバのURL" /d "製品記述" /du "製品のURL" $(BuiltOuputPath)

途中でトークンパスワードを入力する手間が発生するけど。GUIでごにょごにょ入力するよりは、はるかにマシになりました。

以前のバージョンをアンインストールしてくれません。

UpgradeCode は正しく設定しているにもかかわらず、インストーラが以前のバージョンを事前にアンインストールしてくれなくなりました。
いろいろ試したり調べたりしたけど、どうしてもだめでした・・・。
バージョンの表現形式が変わってしまったからなのかもしれません・・・
あるいは、exe形式から msi形式に変わったからなのか?

もし情報をお持ちの方いらっしゃいましたら、教えてくださいませ。

まとめ

ついに Install Shield を脱却しましたw
めでたしめでたし。