【问题标题】:How can I get Visual Studio 2017 to sign a Win32 application automatically?如何让 Visual Studio 2017 自动签署 Win32 应用程序?
【发布时间】:2020-06-04 12:14:45
【问题描述】:

我使用的是 Visual Studio 2017。我不是开发人员。我只是想写一个简单的解析脚本,我熟悉 Visual Studio。我使用 Atmel Studio(基于 VS)编写嵌入式代码,但我不必处理签名。我在工作计算机上安装了 Visual Studio,现在每次构建新版本时都会出现 bit9 错误。

内部 IT 向我指出了一堆稍微过时的证书内容。我现在有一个证书可以应用于我的构建,但是定义的过程here 显然不适用于 Win32 应用程序。我在项目属性中没有签名选项卡。

我还使用 signtool 查看了 Visual Studio 命令行。但是,我需要花费大量时间来了解它的工作原理并实施它。

希望其他人已经解决了这个问题,我可以节省时间。如果没有简单的解决方案,我将返回手动解析,因为这已经占用了我大部分时间。

【问题讨论】:

  • 它给了你一个 pfx 吗? (当然还有密码)。只是好奇。我必须用 VS2010 和 VS2015 来做这件事。除非 MS 最终将它集成到用于非托管 C++ VS 2017 中的项目配置的 IDE 中(听起来它仍然不是),否则您确实可以使用 signtool,只要您拥有 pfx 和关联密码。
  • @WhozCraig 他们给了我一个指向微软网站的链接来生成我自己的 pfx。所以是的。我有一个带有我设置的密码的 pfx。

标签: c++ visual-studio code-signing


【解决方案1】:

这就是我使用 Visual Studio 2010 和 Visual Studio 2015 为非托管 C 或 C++ Win32 应用程序执行此操作的方式。你需要:

  • 签名证书。在 Windows 中工作时,这通常作为 PFX 提供,通常是证书链中的中间证书。
  • 上述 PFX 用于解密证书私钥的密码。

有了这些,可以为您的 Win32 项目创建以下自定义构建步骤:

"$(FrameworkSDKDir)bin\x86\signtool.exe" sign /v /f "path-to-your-cert\yourcert.pfx" /p password "$(TargetPath)" > "$(OutDir)sign\$(ProjectName)-sign.out"

这将使用您的证书对项目输出进行签名(无论是 DLL 还是 EXE 都没有区别),并将签名证书的输出记录在以您的项目命名且后缀为 sign.out 的文件中,并放置该文件在您的输出目录之外名为 sign 的文件夹中。

这似乎有点矫枉过正,但生成输出文件是有原因的。通过创建该文件,并将其命名为自定义构建步骤的“输出”之一:

比较可以用来判断是否重签。每次构建项目时,如果重新生成目标映像(您的 exe 或 dll),则输出文件将是过时的,并且自定义构建步骤将被启动以重新生成它(因此也重新签名图像)。顺便说一句,sign.out 文件将包含以下内容:

The following certificate was selected:
    Issued to: The Signing Cert Name Here

    Issued by: The Issuer Cert Name Here

    Expires:   Sat Dec 31 16:59:59 2039

    SHA1 hash: 232C80E19EBC71330E7C12CA8C07B345B1531777


Done Adding Additional Store
Successfully signed: full-path-to-image-here

Number of files successfully Signed: 1

Number of warnings: 0

Number of errors: 0

获得 PFX 和密码后,您可以轻松地手动测试命令,然后最终将其配置为构建的一部分。我见过的唯一真正的通配符是 signtool.exe 的完整路径,它似乎不时发生变化(例如,VS2008 与 VS2015 不同。

不管怎样,我就是这样做的。希望你也可以。

【讨论】:

  • 这正是我希望我能用命令行做的!原谅我的无知,但我想确保我做对了。我将用我的证书的完整路径替换“path-to-your-cert\yourcert.pfx”。我将用我的密码替换“$(TargetPath)”作为明文?
  • @NateSan 您也可以完全从命令行执行此操作(显然)。您的路径中必须有 signtool.exe,如果您从 Visual Studio 命令提示符运行,它将自动出现。我认为(可能是错误的)您希望将其直接合并到您的解决方案和项目文件中。如果是这样,以上是适用的。如果不是,并且您只需要一个命令行,那么实际上只需要上述的一小部分(实际命令)。
  • 忽略上一个问题。编辑系统搞砸了我。所以“$(FrameworkSDKDir)bin\\x86\signtool.exe”对于我的版本可能准确也可能不准确。签名 /v /f "path-to-your-cert\yourcert.pfx" 只是被 pxf 的完整目录替换了吗? /p 密码变为不带引号的 /p 不管密码。 “$(TargetPath)”是包含 exe 的文件夹的路径? "$(OutDir) 可能和上面的目录一样,对吧?sign\$(ProjectName)-sign.out" 项目名称变成了项目名称中的空格等等?
  • @NateSan 是的,差不多就是这样。 signtool 完成剩下的工作。通常这是作为公司官方构建系统的一部分完成的,因为它们是唯一拥有公司签名证书(通常由 Verisign、Thawt 或其他一些受信任的机构颁发)处于锁定和密钥之下的人,并且是唯一的人可以吐出“官方”公司签名的位。但是,如果您还需要验证码签名作为内部安全检查等的一部分,这是一种方法,通常使用开发生成/管理的证书链。无论如何,希望它有所帮助。
  • 很抱歉一直打扰您,但我遇到了一个错误,但我没有看到问题所在。编译失败并返回 1,我认为这是失败的。使用记事本++ 打开时,sign.out 不显示任何内容。 "C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x86\signtool.exe" 签名 /v /f "C:\Users\nate_roth\Documents\Certifications\cert.pfx" /p mypassword "$(C:\Users\nate_roth\Documents\Visual Studio 2017\Projects\CySmart Log Parser\Debug)" > "$(C:\Users\nate_roth\Documents\Visual Studio 2017\Projects\CySmart Log Parser\Debug) )sign\$(Cysmart Log Parser)-sign.out"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
相关资源
最近更新 更多