使用 Visual Studio 和 LibZ 容器对程序集进行签名

Signing an assembly with Visual Studio and LibZ Container

我在 Visual Studio 中创建了一个相对简单的 WPF 应用程序。因为该应用程序有一些相关的 DLL(从 Nuget 中提取的程序包),我还一直在使用一个名为 LibZ Container 的帮助程序应用程序,除了它适用于 WPF 应用程序之外,它与 ILMerge 一样。 (换句话说,它将 EXE 和所有 DLL 合并到一个 EXE 文件中。)

当我将我的 EXE 文件上传到网络并随后下载它时,无论我使用何种浏览器,我都会收到一条警告,提示该文件可能不安全。例如这里是 Chrome 的警告:

我的假设是我看到这个警告是因为文件未签名。因此,我从 Comodo 购买了代码签名证书。它经历了很多不同的环节才最终获得正确的 PFX 格式的证书,但我最终做到了,并且能够在我的项目的构建属性的 "Sign the assembly" 部分中使用它,在 Visual Studio.

这似乎工作正常,这意味着项目构建成功并使用 PFX 文件进行签名。 但是, 如果我通过 运行 signtool verify /pa MyCoolApplication.exe 检查文件,signtool 实用程序报告文件未签名。这甚至在我尝试使用 LibZ 容器合并 DLL 之前。

当我使用 LibZ 容器进行合并时,我使用这个命令:

libz inject-dll --assembly MyCoolApplication.exe --include *.dll --move

一如既往地有效;但是,如果我使用 signtool 检查内容,它仍会报告文件未签名。然后我尝试通过 运行 这个命令来使用 LibZ 的内置签名机制:

libz sign --include MyCoolApplication.exe --key key.pfx --password abc123

但是,我从中得到的控制台输出以这样的结尾:

Assembly '.\MyCoolApplication.exe' is already signed so it does not need resigning

如果有人好奇的话,我可以post该命令的完整输出。但是,signtool.exe 再次报告该文件未签名。这里有两种我不知道的不同类型的签名吗?

如何使用我的代码签名证书对这个可执行文件进行签名,以便浏览器警告消失?我错过了什么?

经过一些研究,这个问题(错误消息,而不是 signtool 问题)似乎很常见。不幸的是,似乎也没有一种普遍接受的方法来解决它。许多文章和论坛帖子都提供了非常薄弱的​​经验支持的推荐补救措施。话虽如此,这些补救措施似乎得到了最合理的支持:

  1. Request a review of your site/link from Google
  2. Add a logo to your executable
  3. Make sure your headers are in order
  4. Google Webmasters
  5. 中添加您的网站
  6. 让更多人下载文件,或者自己从多台机器上多次下载。

几位发帖者推荐您尝试签署您的文件,但似乎没有太多经验验证,或 Google 没有提及。

所以当我发布这个问题时我没有意识到的是,简单地勾选 "Sign the Assembly" 的方框实际上只是第一步,但还需要明确调用 signtool.exe 到签署可执行文件。

我发现a number of guides online都在解释是这样的。多亏了这些指南,我意识到我需要 运行 这些命令:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f key.pfx /p abc123 /t http://timestamp.comodoca.com /v "MyCoolApplication.exe"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f key.pfx /p abc123 /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /v "MyCoolApplication.exe"

我还发现了一个名为 StrongNameSigner 的 third-party 库的用处,它可以自动为我正在使用的未签名 third-party 库提供强名称。