我有一个相对简单的WPF应用程序,我在Visual Studio中创建。因为应用程序有一些依赖的DLL(从Nuget下拉的包),我也一直在使用一个名为LibZ Container的辅助应用程序,它就像ILMerge一样,除了它适用于WPF应用程序。 (换句话说,它将EXE和所有DLL组合成一个EXE文件。)
当我将我的EXE文件上传到网上然后下载它时,我收到一个警告 - 无论我在哪个浏览器中 - 该文件可能不安全。例如,这是Chrome的警告:
我的假设是我看到此警告,因为该文件未签名。所以,我从Comodo购买了代码签名证书。跳过了很多不同的环节,最终获得了正确的PFX格式的证书,但我最终做到了,并且能够在Visual Studio中为我的项目构建属性的“签署程序集”部分使用它
这似乎工作正常,意味着项目成功构建并使用PFX文件进行签名。 但是,如果我通过运行signtool verify /pa MyCoolApplication.exe
来检查文件,则signtool实用程序会报告该文件是未签名的。甚至在我尝试使用LibZ容器合并DLL之前。
当我使用LibZ Container进行合并时,我使用以下命令:
libz inject-dll --assembly MyCoolApplication.exe --include * .dll --move
和往常一样,这有效;但是,如果我用signtool检查一下,它仍会报告该文件是未签名的。然后,我通过运行此命令尝试使用LibZ的内置签名机制:
libz sign --include MyCoolApplication.exe --key key.pfx --password abc123
然而,我得到的控制台输出结尾是:
程序集'。\ MyCoolApplication.exe'已经签名,因此不需要重新签名
如果有人好奇,我可以发布该命令的完整输出。但同样,signtool.exe报告该文件是未签名的。这里有两种不同类型的签名,我不知道吗?
如何使用我的代码签名证书签署此可执行文件,以便浏览器警告消失?我错过了什么?
答案 0 :(得分:1)
经过一些研究,似乎这个问题(错误信息,而不是signtool
问题)很常见。不幸的是,似乎没有一种普遍接受的解决方法。许多文章和论坛帖子比比皆是,建议采用非常脆弱的经验支持的补救措施。话虽如此,这些补救措施似乎得到了最合理的支持:
几张海报建议您签署您尝试过的文件,但似乎没有太多的经验验证或谷歌的任何提及。
答案 1 :(得分:0)
所以当我发布这个问题时我没有意识到,只需勾选“签署大会”的方框实际上只是第一步,但还需要明确调用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的第三方库自动为我正在使用的未签名第三方库提供强名称的用处。