使用signtool.exe自动执行代码签名,但不存储证书或密码

use*_*413 10 c# code-signing signtool visual-studio-2013

我在Visual Studio 2013中有一个C#/ .NET 4.5 x64项目.不止一个开发人员在这个项目上工作,因此代码在Git中管理.我登录编译.dllS和.exesigntool.exe.我的公司购买了代码签名证书,如果我从命令行手动签名,如下所示:

signtool.exe sign /f cert.p12 /p "password" "compiled.dll"
Run Code Online (Sandbox Code Playgroud)

...然后看起来一切都很棒:我得到了一条成功消息,Windows资源管理器中已编译DLL的属性显示为正确签名.所以,我对实际的签名过程没有任何问题.

但是,证书及其密码不得存在于Git中.它们将在项目的所有开发人员之外提供.我可以假设每个开发人员在构建项目时都会将证书存储在他计算机上的预定义位置,并且他将知道密码.

所以,这是我的问题:如何配置Visual Studio 2013以自动签署其编译输出而不保留Git中的证书或密码?我希望它一样简单,一旦开发人员在预定义路径(或导入,或其他)中拥有证书,并假设开发人员知道证书的密码,在Visual Studio中单击"构建" 2013只是建立和签署它,没有问题.

如果签名过程可以是非交互式的(没有密码提示),那就是奖金.最终,这将是可以签署其输出的持续集成(CI)服务器的一部分,并且因为它是自动的,所以没有人会输入密码.但是,我现在会采取任何解决方案.

我的证书是PKCS#12格式,并受密码保护.Windows声称它没有标记为导出.

dev*_*uff 13

我之前使用的解决方案类似于@Mikko的答案,但它分为两部分:

  1. 一个本地非受控脚本,只设置包含密码的环境变量.这是您为每个开发人员提供的文件.

    @echo off
    set SIGNPASS=whatever
    
    Run Code Online (Sandbox Code Playgroud)
  2. 一个源控制的脚本,它调用前一个脚本并执行实际签名.

    @echo off
    setlocal
    call "C:\local\signing_password.bat"
    "C:\toolpath\signtool.exe" sign /f "c:\certpath\cert.p12" /p "%SIGNPASS%" "%1"
    endlocal
    
    Run Code Online (Sandbox Code Playgroud)

setlocal/ endlocal对保证,如果脚本手动运行密码不泄漏到环境中.

"%1"是在Post Build步骤中作为脚本参数传递的可执行文件的路径...

  • 在您的signtool路径之后,您错过了"sign"命令 (2认同)

小智 8

我无法添加 Daniel Schl\xc3\xb6\xc3\x9fer\ 的答案 - 在我看来这确实是最好的答案。将证书添加到证书存储区后,签名时不需要密码和 pfx。

\n\n

不过我想添加以下评论:

\n\n
    \n
  1. 证书必须正确安装在证书存储中(我使用了 .pfx 和密码)
  2. \n
  3. Signtool.exe 必须支持 /sha1 命令行选项(我正在使用 10.0.16299)
  4. \n
  5. 对于我的证书,我花了很长时间才意识到我需要使用 /sm 开关来指定“机器存储”而不是“用户存储”
  6. \n
  7. 指纹可在证书属性的“详细信息”选项卡中找到
  8. \n
  9. 尽管我读过另一篇文章,但指纹哈希不区分大小写
  10. \n
\n\n

这是我适用于 SHA256 的命令行(哈希已更改):

\n\n
signtool.exe sign /sm /debug /v /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /sha1 65cc2e77dc52b99d46e7caae2377bb5d7d9384b2 "D:\\app.msi"\n
Run Code Online (Sandbox Code Playgroud)\n


小智 7

另一种方法是在每个开发人员私有证书存储中导入证书,然后使用带有signtool的指纹:

signtool ... /sha1 'hex thumbprint' ...
Run Code Online (Sandbox Code Playgroud)

然后,您只需在初始导入证书期间而不是在构建期间需要密码.