如何验证 Authenticode 时间戳?

信息安全 证书 公钥基础设施 x.509 代码签名 时间戳
2021-09-02 17:58:03

对于在原始签名证书过期后(通常是颁发后 1-3 年)可由 Windows 验证的 Authenticode 签名文件,该文件还需要具有 Windows 可以验证的加密签名时间戳。

有许多Authenticode 时间戳服务可以免费为您的二进制文件签名(如果它们当时在线并且正在工作)。

仅将与时间戳签名关联的证书链接回 Windows 证书存储中的一个受信任的根 CA 是不够的,否则您自己的 Authenticode 密钥可用于对时间戳进行签名,从而使整个练习毫无意义(您可以使用过期的证书进行签名,然后伪造过去的时间戳)。

Windows 在接受签名之前是否有 X.509 时间戳属性检查证书?如果是这样,您如何获得这样的证书?

或者是否有单独的 Authenticode 时间戳信任层次结构?

1个回答

仅当时间戳授权证书包含扩展密钥使用扩展,该扩展本身宣传特定id-kp-timeStamping对象标识符(又名 1.3.6.1.5.5.7.3.8)时,它才会被接受虽然 Authenticode 时间戳不遵循RFC 3161格式,但 TSA 证书上的规则仍然相同(参见第 2.3 节)。

上有验证码的时间标记的一些信息存在与标准 (RFC 3161) 时间戳一样,它们依赖于 PKCS#7(又名“CMS”),但由 TSA 签名的数据元素的确切格式不同。

这篇博客文章宣传了某种支持 Authenticode 的“你自己的 TSA”产品(我没有以任何方式尝试过);这将间接意味着制作您自己的 TSA 证书并让 Windows 接受它作为对 Authenticode 时间戳有效是可行的。

任何 CA 都可以颁发带有“TSA”对象标识符的证书(其中没有概念上的困难),但大多数已建立的 CA 不会,主要是因为缺乏需求。请注意,正确运行 TSA意味着保持足够准确的时钟,对改变其时间概念的外部尝试具有弹性(当心 NTP !),这并不容易。如果你试图达到亚秒级的精度,实际上是很难做到的(例如你必须处理闰秒,你不能忽略它们)。