代码签名证书过期后还有效吗?
代码签名证书过期后,已经完成签名的程序不一定会因为证书过期而立即失去签名有效性,关键在于签名时是否加入了可信时间戳,以及验证平台能否根据时间戳确认签名发生的时间。
代码签名时间戳由可信时间戳机构 TSA(Time Stamping Authority)提供:签名工具把签名相关数据提交给 TSA,TSA 返回可验证的时间戳令牌,软件签名中因此包含可靠的签署时间依据。三个概念各司其职:代码签名证书解决"是谁签的",数字签名解决"代码有没有被修改",可信时间戳解决"什么时候签的"。使用时间戳时,证书后来正常过期不影响此前已完成的有效签名;没有时间戳时,证书过期后长期验证的可信状态取决于操作系统、签名格式和验证策略。证书吊销与正常过期不同,需要结合吊销原因、吊销时间、签名时间戳和平台验证规则判断。
答案取决于时间戳:签名时加了可信时间戳,证书后来正常过期,已签名的软件一般不受影响。数字证书的用途分类,先看数字证书的用途分类——代码签名证书和网站 SSL 证书都属于数字证书但用途不同,区别见代码签名证书和网站证书的区别。
证书过期后为什么还能验证
要区分两个时间:代码签名证书的有效期,和代码实际完成签名的时间。例如证书有效期 2026 年 1 月 1 日至 2027 年 1 月 1 日,软件 2026 年 8 月 20 日签名,用户 2028 年安装。签名包含可信时间戳且时间戳证明签名发生在 2026 年 8 月 20 日,验证方可以确认该代码在证书有效期内完成签名。到了 2028 年即使证书过期,也不能仅因"当前日期超过有效期"否定此前的签名。
什么是代码签名时间戳
代码签名时间戳(Timestamping)由可信时间戳机构 TSA 提供签署时间证明。签名过程中,签名工具将签名相关数据提交 TSA,TSA 对相关信息提供可验证的时间戳令牌,软件签名因此包含可信的签署时间依据(RFC 3161 标准)。
简单理解:代码签名证书解决"是谁签的",数字签名解决"代码有没有被修改",可信时间戳解决"什么时候签的"。三者共同支持代码签名的长期验证。
有时间戳和没有时间戳的区别:
| 签名情况 | 证书后来过期 | 长期验证 |
|---|---|---|
| 有可信时间戳 | 可以证明签名发生在证书有效期内 | 更有利于长期验证 |
| 没有可信时间戳 | 缺少可靠的签署时间依据 | 证书过期后验证结果取决于具体平台和验证策略 |
准确的说法不是"没有时间戳,证书一过期代码就一定失效",而是"没有可信时间戳时,证书过期后缺少证明签名时间的可靠依据,长期验证的兼容性和可信状态更容易受影响"。对需要长期发布、安装和更新的软件,时间戳属于代码签名的重要组成部分。
过期和吊销有什么区别
证书正常过期:有效期到了规定结束时间。代码在有效期内完成签名且包含可信时间戳时,验证方按时间戳判断签名时间,证书正常过期不意味着此前签名的软件自动失去签名有效性。
证书被吊销:CA 因私钥泄露、申请信息问题等原因提前吊销时,验证结果需要结合吊销原因、吊销时间、签名时间戳和平台验证策略判断。不能说"证书被吊销所有历史签名立即失效",也不能说"有时间戳被吊销证书签名的软件就永远有效"。
怎么给代码签名加时间戳
Windows 环境用 SignTool:
signtool sign /tr https://你的TSA地址 /td SHA256 /fd SHA256 YourApp.exe
/tr 指定 RFC 3161 时间戳服务器,/td SHA256 指定时间戳摘要算法,/fd SHA256 指定文件摘要算法。TSA 地址以代码签名 CA 或时间戳服务提供方当前公布的信息为准,不建议长期依赖文章里写死的第三方地址。签名后用 signtool verify /pa /v YourApp.exe 验证,具体参数按程序类型和目标 Windows 信任策略调整。验证可以用代码签名验证工具辅助。
Java JAR 用 jarsigner:
jarsigner -tsa https://你的TSA地址 yourapp.jar alias
签名后:
jarsigner -verify -verbose -certs yourapp.jar
生产环境使用当前可用且受信任的 TSA 服务,并确认签名算法、时间戳协议和目标 Java 版本的兼容性。
过期后需要重新签名吗
不一定。软件已用有效证书签名且包含可信时间戳,证书后来正常过期,一般不需要因为"证书过期"重新给已发布软件签名。需要重新签名的情况:软件本身发生修改、原签名损坏、签名证书存在安全问题、私钥泄露、CA 吊销证书后目标平台无法继续信任、新版本软件需要新证书。证书过期和签名文件是否需要重签,不是同一个问题。
证书到期后的处理:提前申请新证书、安全保管新签名私钥、用新证书签署后续版本、每次签名加入可信时间戳、保留历史签名证书和签名记录、对已发布软件持续验证。不要因为旧证书即将到期就批量修改并重新签署已发布软件——旧签名有效且有时间戳时,没有理由仅为更新有效期而重签。证书产品的采购规划可以参考证书选购的通用思路。
时间戳注意事项
时间戳本身也是验证链的一部分。实际部署注意:使用可信 TSA 服务;优先用当前标准支持的时间戳协议;确认时间戳算法与目标平台兼容;签名完成后检查时间戳是否真正写入;不要只检查"签名成功",还要验证完整签名链;对生产环境的签名证书、私钥和时间戳信息做好长期管理。
尤其要注意,时间戳不是代码安全性的替代品。它解决的是"签名发生在什么时间"的证明问题,不能证明软件没有恶意代码,也不能修复已被篡改的程序。
常见问题解答
代码签名证书过期后,已经签名的软件还能正常使用吗?
如果签名时使用了可信时间戳,可以证明代码在证书有效期内完成签名,证书后来正常过期不意味着历史签名自动失效。具体结果还取决于操作系统和软件验证机制。
代码签名没有时间戳,证书过期后一定失效吗?
不能一概而论。没有时间戳意味着验证方缺少可靠的签署时间依据,证书过期后的长期验证更容易受具体平台验证策略影响。生产环境代码签名建议始终使用可信时间戳。
代码签名证书被吊销后,有时间戳还有效吗?
不能简单判断有效或无效。需要结合证书吊销原因、吊销时间、签名时间戳和目标平台验证规则判断。时间戳本身不能保证被吊销证书签署的软件永久有效。
代码签名证书过期后,需要重新签名旧软件吗?
一般不需要仅因证书正常过期就重新签名。旧软件签名完整且有可信时间戳时,可继续作为历史签名验证。新版本软件用新的有效证书重新签名。
代码签名证书过期后,已签名软件是否继续获得信任,不能只看证书当前是否过期。可信时间戳能证明签名发生的时间,使验证方判断签名时证书是否有效,生产环境签名应始终加入可信时间戳。同时要区分证书正常过期与吊销:两者对历史签名的影响不同,最终验证结果还取决于目标平台和具体验证策略。



京公网安备11010502031690号
网站经营企业工商营业执照
















