3

我正在开发一个程序,该程序需要在打包到 MSI 部署项目之前对每个 exe 进行签名。我试过使用 VS2010 的签名工具(“签署程序集”),但密钥文件似乎不像 VS2010。VS 不要求输入密码或任何密码,也不签署 exe。所以,我一直在通过 post-build 命令行运行签名工具。

在我们过多参与之前,我们应该看一下应用程序的当前结构(我无法控制它。我只是在制作更新程序并尝试测试打包):

  • 父文件夹
    • 主 EXE 项目文件夹
    • 更新程序 EXE 项目文件夹
    • 服务项目文件夹
    • 安装程序设置(卸载过程等)项目文件夹
    • 部署项目文件夹
    • 签名文件夹

我在某处读到部署项目在不同的文件夹(obj/x86/Release/app.exe而不是bin/Release)中生成 exe。

我目前确保签署文件的方法是硬编码路径,如下所示:

"..\..\..\..\SigningFolder\signtool" sign /f "..\..\..\..\SigningFolder\myKeyFile.p12" /p mypassword /t http://somecertsite.com "..\..\..\..\Updater\Updater\obj\x86\Release\Updater.exe"

"..\..\..\..\SigningFolder\signtool" sign /f "..\..\..\..\SigningFolder\myKeyFile.p12" /p mypassword /t http://somecertsite.com "..\..\..\..\Updater\Updater\bin\Release\Updater.exe"

这让我的眼睛流血了。(每个 EXE 都会发生这种情况,并且在构建 MSI 后,我也会签署 MSI。

所以,我的问题:

  • 有没有办法以路径的绝对输出为目标?如果我使用$(OutDir),它指向bin\Release通过部署项目进行编译时。(或者一般......有没有更好的方法来做到这一点?)
4

1 回答 1

4

我的方法是在我的部署项目 PostBuildEvent 属性中添加以下行(假设我需要使用存储在智能卡上的证书(/a选项)并且无法通过环境变量确定 signtool 路径):

call "C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe" sign /a /d "$(SolutionName)" /q "$(BuiltOuputPath)"

这将对生成的 MSI 进行签名,但不会对随附的 EXE 文件进行签名。为此,我还在我的 C# 项目(项目 > 属性 > 构建事件)的构建后事件中添加了以下几行:

call "C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe" sign /a /d "$(SolutionName)" /q "$(TargetDir)$(TargetFileName)" "$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"

这样做将在成功构建后签名:

  1. 从我的 C# 项目构建的 EXE 文件(在bin目录下)
  2. 我的部署项目使用的 EXE 文件作为“主要输出”(在obj目录下)
  3. 最后是 MSI 包

然后,最后,我没有任何未签名的可执行文件,这是我正在寻找的:)

于 2013-05-02T09:51:18.733 回答