代码签名时间戳仍会过期,即使使用时间戳服务器。

6

不知道为什么,但当使用Symantec的时间戳服务器进行代码签名时,它将过期时间设置为2020年。这使得使用时间戳服务器失去了意义,因为我的程序仍然会过期。

以下是使用signtool.exe验证时间戳应用程序的输出:

Signature Index: 0 (Primary Signature)
Hash of file (sha1): A6F0CEC09F02900D7977C60A87567031D0D96C7A

    Signing Certificate Chain:
        Issued to: thawte Primary Root CA
        Issued by: thawte Primary Root CA
        Expires:   Wed Jul 16 19:59:59 2036
        SHA1 hash: 91C6D6EE3E8AC86384E548C299295C756C817B81

            Issued to: Thawte Code Signing CA - G2
            Issued by: thawte Primary Root CA
            Expires:   Fri Feb 07 19:59:59 2020
            SHA1 hash: 808D62642B7D1C4A9A83FD667F7A2A9D243FB1C7

                Issued to: My Company
                Issued by: Thawte Code Signing CA - G2
                Expires:   Tue Aug 11 19:59:59 2015
                SHA1 hash: E45B4CBFBA095DB9465F2371C161EF500201561B

    The signature is timestamped: Wed Oct 22 12:15:44 2014
    Timestamp Verified by:
        Issued to: Thawte Timestamping CA
        Issued by: Thawte Timestamping CA
        Expires:   Thu Dec 31 19:59:59 2020
        SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656

            Issued to: Symantec Time Stamping Services CA - G2
            Issued by: Thawte Timestamping CA
            Expires:   Wed Dec 30 19:59:59 2020
            SHA1 hash: 6C07453FFDDA08B83707C09B82FB3D15F35336B1

                Issued to: Symantec Time Stamping Services Signer - G4
                Issued by: Symantec Time Stamping Services CA - G2
                Expires:   Tue Dec 29 19:59:59 2020
                SHA1 hash: 65439929B67973EB192D6FF243E6767ADF0834E4


    Successfully verified: SetupGoVivoConsole.exe

    Number of files successfully Verified: 1
    Number of warnings: 0
    Number of errors: 0

请注意,此证书设置为1年过期,因此使用Symantec提供的服务器时间戳。根据有限的文档,在签署应用程序时使用时间戳服务器应该可以消除证书过期后应用程序过期的问题。但根据我所看到的信息,这并不是情况,因为我的应用程序将在2020年12月29日星期二19:59:59停止运行。
signtool的命令如下:
signtool.exe sign /f "certificate.pfx" /ac "thawte.crt" /p "mypassword" /t http://timestamp.verisign.com/scripts/timstamp.dll "ExecutableToSign.exe"
3个回答

6
使用时间戳的目的并不是为了使您的签名永久有效。它的目的是延长您的签名的有用寿命,从通常1到3年的代码签名证书有效期延长到长达10年。这对大多数需求来说足够长了——谁真的认为他们的代码将在不安全网络中传输(因此需要代码签名)并执行10年后呢。
时间戳服务所做的只是使用时间戳服务的证书签署包含您数字签名哈希值和当前时间的信息,时间戳服务的证书(他们希望)比大多数数字证书用户更加严格保管,并且其有效期更长。尽管它们的有效期很长,但它们仍然只是数字证书,而对于基本的安全性来说,每个数字证书最终都必须过期。考虑到计算机变得越来越强大,即使今天支持最安全算法和最长签名密钥,最终也会变得不安全。
请注意,过期日期只是证书(无论是您的代码签名证书还是时间戳证书)可以有效的最长时间。即使今天一些时间戳服务器使用SHA-1进行签名(例如,这就是您的时间戳示例正在使用的方式),当该算法不再可信时(这应该不会太久),所有这些SHA-1时间戳将不再受信任。即使未达到到期日,这也会发生。
您应该查找其他时间戳服务。有一些服务可提供更长的有效期,并使用SHA256。
如果有人能够创造出永远无法破解的加密方式,那么他们终将创建您所要求的“永久”时间戳。但请不要抱有太大希望。
干杯!

RFC 3161要求时间戳服务器证书必须到期: 见第4.3节。“TSA签名密钥必须足够长,以允许足够长的有效期。即使这样做了,密钥也有有限的寿命。”时间戳服务器证书的过期是为了安全起见,因为使用的算法不是永久“安全”的。这样人们就可以随时用现代和安全的加密算法更新时间戳服务器证书。 - Rex Linder
你写道“使用时间戳的目的并非是让你的签名永久有效。”-- 我认为这取决于依赖方的软件,但至少在Authenticode中似乎是可能的。在authenticode_pe.docx的第14页上写道:“默认情况下,为Authenticode签名加上时间戳会无限期延长签名的有效期……” - undefined

5
我可以从今天我痛苦的经历中证实:一个过期的时间戳证书(在我的情况下,是Comodo的时间戳证书)会导致Windows(7)在整体代码签名检查中出错,错误代码为0x80096005。
所以,与我查看的所有证书提供商声称的相反,时间戳 并不能 保证你签名的可执行文件永久有效。
寻找一个使用有效期较长的证书进行时间戳服务。

Verisign是我所知道的最先进的技术之一,但它并不遥远——只有几年而已。你能提供一下这个错误的屏幕截图吗?如果可以捕获到它,那就好了。 - Kraang Prime
3
错误并不是来自 Windows 对话框之类的东西。使用 signtool 命令并带上 verify 参数会弹出我上面列出的错误代码。使用已过期时间戳证书签名的可执行文件的属性对话框中的数字签名信息显示“其中一个计数签名无效。该文件可能已被更改。”在查看时间戳签名的详细信息时,你会看到“时间戳签名和/或证书无法验证或格式不正确。”这些可执行文件在最初构建时被验证为具有有效的签名,并且证书未在撤销列表中。 - Erik Knowles

1
根据我上面看到的信息,这并不是事实,因为我的应用程序将在2020年12月29日周二19:59:59停止运行。为什么会停止运行?你试过吗?尝试将计算机日期设置为2021年,看看会发生什么。个人没有尝试过,但我的同事尝试过。Windows仍将运行该程序。它将验证应用程序的签名日期。TSA服务器证书当时有效,所以不应该有问题。如果应用程序的签名上没有时间戳,那将是一个问题。在签名者证书过期后,Windows将无法运行该应用程序。但是使用时间戳时,Windows不关心TSA证书的到期日期。

谢谢您的回复,不过,您能否提供一个链接,以证明Windows不会查看时间戳服务器的过期时间? - Kraang Prime
Signtool使用一些“默认身份验证验证策略”来验证应用程序的签名。我试图找到一些关于它是什么的文档,但没有运气。我找到的最接近的是cryptography toolsSetReg tool - pepo
因此,该应用程序并没有停止运行,但它已经“取消签名”,就像该程序从未被签名过一样。 - Kraang Prime
@SamuelJackson 我仍然可以在我的旧.exe文件的属性中看到数字签名。时间戳证书已于2015年过期,代码签名证书也已于2015年过期。 - pepo

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