Signtool.exe /dg /ds /di 选项和时间戳

Posted

技术标签:

【中文标题】Signtool.exe /dg /ds /di 选项和时间戳【英文标题】:Signtool.exe /dg /ds /di options and timestamping 【发布时间】:2020-01-15 18:18:19 【问题描述】:

我们正在努力使用 signtool.exe 摘要选项优化数字签名过程。到目前为止,工作流程如下所示:

    在客户端上创建摘要:signtool.exe sign /f cert /fd sha256 /dg 。我的文件.dllMyFile.dll.dig 摘要发送到我们的签名服务器。 签名服务器上的签名摘要:signtool.exe sign /f cert /fd sha256 /ds MyFile.dll.dig 将签名 MyFile.dll.dig.signed 发送回客户端。 在客户端创建签名:signtool.exe sign /di .MyFile.dll 在客户端添加时间戳signtool.exe timestamp /tr http://some_timestamp_server /td sha256 MyFile.dll

有没有办法在签名服务器上执行时间戳?

【问题讨论】:

是什么阻止您在签名服务器上执行时间戳? 命令是什么? signtool.exe 时间戳... MyFile.dll? MyFile.dll 永远不会发送到签名服务器。 为什么不将 MyFile.dll 文件发送到签名服务器,签名服务器将使用您在问题中编写的命令应用时间戳? 因为文件大小。它可能是数百兆字节。虽然 .dig 和 .deg.signature 文件非常小,不到 1K。 当我尝试在本地复制它时,我似乎需要一个在步骤 1 中创建的 p7u 文件。你有同样的行为吗? 【参考方案1】:

有没有办法在签名服务器上执行时间戳?

不,除非将整个文件传输到您的签名服务器。时间戳是直接应用于文件本身的操作,因此文件必须存在于本地。您的远程签名服务之所以有效,是因为只需要对摘要进行签名,而不是对完整的二进制文件进行签名。但是,正如您所指出的,您仍然需要使用 /di signtool 选项在本地提取签名摘要。

可以做的是创建一个自定义工具,以根据您的要求以编程方式对文件进行签名和时间戳。有关如何使用支持时间戳的SignerSignEx2 函数,请参阅这篇 Microsoft 文章。https://docs.microsoft.com/en-us/windows/win32/appxpkg/how-to-programmatically-sign-a-package?redirectedfrom=MSDN

您可能已经看到了这一点,但我也会查看 AzureSignTool 存储库,它使用未记录的 SignerSignEx3 函数使用回调执行签名。您可以通过调用其他一些自定义签名服务来合理地替换 Azure 功能。

【讨论】:

当我尝试在本地复制它时,我似乎需要一个在步骤 1 中创建的 p7u 文件。你有同样的行为吗?我假设这个文件包含 PKCS7 中的证书,然后 .signed 文件包含 Base64 中的签名。最后一步是否只是将它们合并? 我不相信 .p7u 文件是必需的,但我不完全确定你在问什么。您是指时间戳作为最后一步吗? 其实摄取步骤:signtool.exe sign /di .MyFile.dll。如果您从 MyFile.dll 所在的目录中删除 p7u 文件,那么您将收到来自 signtool 的错误 所以是的..这个.p7u有什么..为什么它很重要?有人吗?

以上是关于Signtool.exe /dg /ds /di 选项和时间戳的主要内容,如果未能解决你的问题,请参考以下文章

如何为 VS 2017 安装 SignTool.exe?

我该如何扭转这个? - “签名时出错:找不到 SignTool.exe”

使用 .cer 文件对 .exe 进行签名(signtool.exe 要求的证书名称是啥?)

使用SignTool.exe对文件进行数字签名

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

Visual Studio 签名失败(signtool.exe 错误)