如何使用多个时间戳进行代码签名 - 我的邮票被覆盖

How to Code Sign with multiple timestamps - my stamps get overwritten

问题

虽然我在 windows 可执行文件上使用详细的 SignTool (manual) 命令时没有收到任何错误,但时间戳会被覆盖,我希望有多个时间戳,这可能吗?


这是我试过的

PowerShell 函数

function sign32exe([string]$arg)
{
    & 'C:\Program Files (x86)\Windows Kits\bin\x86\signtool.exe' sign /fd sha256 /a $arg
    Start-Sleep -Seconds 5
    & 'C:\Program Files (x86)\Windows Kits\bin\x86\signtool.exe' timestamp /tr http://timestamp.globalsign.com/?signature=sha2 /td sha256 /v $arg
    Start-Sleep -Seconds 5
    & 'C:\Program Files (x86)\Windows Kits\bin\x86\signtool.exe' timestamp /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td sha256 /v $arg
    Start-Sleep -Seconds 5
    & 'C:\Program Files (x86)\Windows Kits\bin\x86\signtool.exe' timestamp /tr http://time.certum.pl /td sha256 /v $arg
}

PowerShell 输出

我从 SignTool 获得了正输出,但每次调用都会覆盖时间戳(重组以提高可读性):

签约过程顺利:

Done Adding Additional Store
Successfully signed: .\my.exe

后面是时间戳,单独使用没有问题:

Successfully timestamped: .\my.exe
Number of files successfully timestamped: 1
Number of errors: 0

Successfully timestamped: .\my.exe
Number of files successfully timestamped: 1
Number of errors: 0

Successfully timestamped: .\my.exe
Number of files successfully timestamped: 1
Number of errors: 0

文字图片


理由

我拥有的证书来自 Certum 机构,名为 Standard Code Signing。由于它很快就会过期,我想确保我的 windows 可执行文件在我的签名证书过期后不会遇到麻烦。我认为更多的时间戳会更好,以防一台服务器及时不可用或服务停止,例如 Certum 权限将消失。


其他详细信息

我的理想方案应该是解决上面的问题:

这个问题看起来像 Code Signing with Multiple Timestamp servers 的副本。

简短的回答是:不,时间戳不可能不止一次。

但是可以使用不同的算法进行签名 (dual-sign),但这意味着将生成两个单独的签名,每个签名都有自己的时间戳。

多个时间戳实际上意味着什么?时间戳告诉消费者资产何时被签名。签名的单一动作不可能在两个不同的时刻完成。除非应用了两个不同的签名,每个签名都有自己的时间戳 (dual-sign)。

另外,让我们假设可以将两个时间戳应用于同一个签名。假设文件于 2019 年 1 月 1 日签署,第一个时间戳应用在 2019 年 2 月 1 日,第二个时间戳应用在 2020 年 3 月 3 日。对于验证签名的客户来说意味着什么?这真的没有多大意义,不是吗?只有后一个时间戳真正重要,如果证书仍然有效 - 这就是 SignTool 覆盖前一个时间戳的原因。

顺便说一句,一般来说有很多关于时间戳的文章,其中 none 提到为证书分配多个时间戳,例如: