プロジェクトの 1 つで、Authenticode でバイナリに署名する最も簡単で安全な方法を見つけようとしています。
これを行う最も簡単な方法は、コンパイルの結果 (すべてのバイナリを含む完成したインストール パッケージ) を取得し、そこからアセンブリを抽出して署名し、これらの署名済みアセンブリを MSI に再パックしてから署名することです。
MSI からのファイルのアンパックに関する情報はたくさんありますが、再パックに関する情報はありません。どうすればいいですか?
プロジェクトの 1 つで、Authenticode でバイナリに署名する最も簡単で安全な方法を見つけようとしています。
これを行う最も簡単な方法は、コンパイルの結果 (すべてのバイナリを含む完成したインストール パッケージ) を取得し、そこからアセンブリを抽出して署名し、これらの署名済みアセンブリを MSI に再パックしてから署名することです。
MSI からのファイルのアンパックに関する情報はたくさんありますが、再パックに関する情報はありません。どうすればいいですか?
元の応答を編集しています...
無人ビルドプロセスに署名を埋め込みたい場合は、MSBuildSignFileタスクを使用できます。このタスクはauthenticode署名APIをラップしますhttp://msdn.microsoft.com/en-us/library/ms164304.aspx
または、SignTool.exeの呼び出しを使用します。
certmgr.exeまたはcertificatesmmcsnapinを使用して、ソフトウェア発行証明書をマシンにインストールする必要があります。ローカル証明書ストアにインストールしたら、SHAサムプリントを使用して参照します。これは、証明書のプロパティにあるか、certmgr.exeに証明書をリストするだけです。
証明書を定期的に更新する必要があるため、ビルドの開始時に証明書をローカルに再インポートし、証明書ハッシュをプルするための追加の手順がビルドにあります。古いバージョンに戻ってビルドする必要がある場合に備えて、ハッシュをソース管理に保存しないことをお勧めします。これは、環境構成の一部である必要があります。たとえば、環境変数など、ソースコードから切り離すことができるものです。
また、署名の有効性を保証できるように、署名されたファイルにタイムスタンプを付けることを忘れないでください。また、署名をタイムスタンプから切り離すことをお勧めします。タイムスタンプはネットワーク操作であり、ときどき失敗する可能性があります。タイムスタンプの失敗は、公開される可能性のあるゴールドビルドの問題にすぎないため、署名の失敗とタイムスタンプの失敗を区別できると便利です。
ビルドシステムが何であるかは述べていませんが、私のプロジェクトが通過する(過度に単純化された)フローは次のとおりです(CruiseControl.netからトリガーされるほとんどすべてにnantタスクを使用します)
signtool.exe
すべての関連ファイル(exe、dll、ocxなど)に署名を使用する途中で失敗した場合は、開発チームにメールを送信してください。
これは、MSBuild、Nant、またはその他のさまざまなツールを使用して実行できるはずです。おそらく場所によっては少しカスタム作業が必要になりますが、最終的には、ビルドとの人間の対話を必要としない信頼性の高いビルドシステムになります(誰かがビルドを「強制」したい場合を除き、Webページのボタンをクリックするだけです)。か何か)