如何在使用signtool签名代码时包含完整的证书链?

10

我该如何在使用signtool签署代码时包含整个认证路径?

旧版本的signtool会在数字签名中包含整个认证路径。现在如果我用signtool签署一个可执行文件:

signtool.exe" sign /v /f avatar.pfx -t "http://timestamp.verisign.com/scripts/timstamp.dll" app.exe

签名无效:

enter image description here

这是因为没有认证路径:

enter image description here

使用较旧版本的 signtool 签名的二进制文件可以正常工作:

enter image description here

我该如何告诉Signcode在签名时包含整个证书路径?

签署二进制文件的正确方式是什么?


更新: SignTool 版本 6.1.7600.16385:

enter image description here

另请参阅

3个回答

10

使用 /ac 命令并传递证书根目录下的 .cer 文件名(对于 Verisign,当签署内核代码或其他特殊代码时,上次我检查过它被称为 MSCV-VSClass3.cer)。

signtool.exe sign /v /f "Avatar.pfx" 
      /ac "Thawte Code Signing CA - G2.cer" 
      -t "http://timestamp.verisign.com/scripts/timstamp.dll" app.exe

这应该由您的CA提供。通常,MS为其在Windows中接受的各种CA提供捆绑包。

参见:

无论如何,据我所知,这仅适用于内核代码和非常特定的其他事物(例如,Windows安全中心)。


这是绕过 signtool 问题的一种解决方法吗?搜索发现没有人这样做。 - Ian Boyd
@Ian:我知道这听起来可能有些荒谬,但是在Vista或Vista SP1首次引入signtool时引入了一些更改。从那时起,我们将证书存储在证书存储中,它完美地工作。当然,/ac仅用于特殊目的。还要确保签名机器上的根证书是最新的。 - 0xC0000022L
1
我在SO上找到了另一个人(http://stackoverflow.com/questions/2814233/how-can-i-sign-an-activex-control-with-a-code-signing-certificate-and-be-a-verifi)。他表示,他成功创建了一个包含根证书、中间签名证书、签名证书和私钥的PFX。我留了个评论问他用什么命令将其他证书放入他的`pfx`文件中。我们的证书提供商Thawte没有为他们的根证书或中间证书提供其他文件(cer、pfx或其他)。 - Ian Boyd
我一直认为所有证书最终都必须由可信的根证书签名。Windows预装了几个受信任的根证书 - 因此不需要网络访问; 它已经存在于本地计算机上了。 - Ian Boyd
@Ian:很奇怪。祝你和那个人好运。也许在本地机器上可以,但是在引导程序的最早阶段,驱动程序无法访问证书存储。我想这可能与根证书每隔几年被替换有关... - 0xC0000022L

2
如果您使用 Thawte,则下载他们的 primaryca.cer

下载文件 primaryca.cer 并使用以下方式签署您的文件:

signtool sign /f certificate.pfx /p PASSWORD /ac primaryca.cer APP.exe.

应该可以工作。

0

关于 Authenticode 签名的文档

  • Windows Authenticode 可执行文件签名格式 (.docx )

指出 PKCS #7 SignedData 结构包含签名证书和任何中间证书,但通常不包含根证书。

然而,在我有点“糊涂”的时候发现,signtool.exe 必须能够找到证书以包含它们。

叶证书在命令行中提供。但是,沿着链条的其余证书的识别不包括证书的位置。signtool确实检查系统证书存储库,因此如果在那里找到它们,则会将它们添加到二进制文件中。如果没有找到它们,signtool只会将叶证书放入已签名的二进制文件中。

请注意,如果中间证书不在已签名的二进制文件中,但在检查签名的系统的系统证书存储库中,则二进制文件仍将通过验证,因为可以解析链。

还要注意,从已签名的二进制文件中排除根证书是有意义的,因为必须独立地将根证书放在检查签名的系统上才能信任它,因此它将被忽略。(将根证书包含在二进制文件中的唯一真正好处是如果某人想手动导入根证书,这几乎总是一个非常糟糕的想法。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接