有签名的时间,也有验证的时间。让我们首先简化情况:我们假设当前日期是 2009-07-08。对于“现在”的值,RootCA 和 SubCA 证书仍然有效,但 Alice 的证书无效。您会看到一个据称是 Alice 于 2009 年 5 月 1 日制作的签名。
如果您尝试验证 Alice 的证书,您会发现它已“过期”,并且根据X.509,这就是故事的结尾(第 6.1.3 节,步骤 a.2)。可能存在签名在过去某个日期已经存在的证据,例如 2009-05-02;时间戳就是这样的证明。那时,Alice 的证书仍然有效,因此您几乎可以想象自己在 2009 年 5 月 2 日查看签名和证书,并运行当时的验证算法。如果您当时确信签名的有效性,您现在仍然会记得它。这是以往验证的基础。
但你真的可以这样穿越吗?撤销有问题。通俗地说,你怎么知道 Alice 的私钥是否被盗了?想象一下,在 2009 年 4 月 15 日,一个邪恶的人(我们称他为阿尔伯特)偷走了爱丽丝的钥匙。当然,在 2009 年 5 月 1 日使用该密钥计算的签名不能毫无疑问地归因于爱丽丝,因为阿尔伯特本可以计算出同样的结果。在 X.509 中,关于被盗密钥(X.509 用语中的“泄露密钥”)的信息是通过撤销来分发的。SubCA 发布的 CRL 将包括 Alice 的证书,其“撤销日期”为 2009-04-15(盗窃可能仅在几天后被发现,但 CRL 格式包含一个说明截止日期的字段)。现在是棘手的一点:包括关于在日期T仍然有效(根据“有效期”)的证书的信息。在 2009-07-08,SubCA 当前发布的 CRL 不包括 Alice 的证书,因为 Alice 的证书已经过期,你无法知道它是否在某个时候被撤销。
因此,对于过去的验证,您需要的不仅仅是签名上的时间戳;您还需要在 Alice 的证书尚未过期时颁发的一些撤销对象(CRL、OCSP 响应......)的时间戳。
在上面的讨论中,您会看到两个基本工具:
- 时间戳允许某些形式的时间旅行,您在其中设想自己在过去的日期,对自该日期以来被证明存在的某些值(签名、证书等)进行操作。
- 撤销是让您了解关键妥协的方式。
如果我们现在认为自己在 2010-02-01,我们有两个额外的复杂层:
- SubCA 的证书也已过期。因此,您还需要注意 SubCA 密钥被盗的可能性。这是同一个问题,上一级:SubCA 的证书被认为是有效的,因为它是由根 CA签名的。
- RootCA 的证书也“过期”了。这是一个根 CA,因此它并不是真正的“证书”(由谁认证?),而是一些关于名称和公钥的先验可信信息。如果RootCA 有一个到期日期,那么这意味着在该日期之后,您认为您不一定会知道根私钥是否被泄露。严格来说,过了那个日期,你就没有任何信任,所以你输了。
所有验证“模型”都只是通过忽略密钥妥协的一些可能性来绕过这些问题的精心设计的方法。例如,人们会认为无论如何都会知道根的私钥被盗,即使在正式的根“到期”之后也是如此,并且根的生命周期结束日期只是一个管理问题。如果您开始忽略一些可能的安全问题,取决于所谓的“模型”,那么根据模型,某些签名将被视为有效或无效也就不足为奇了。
然而,如前所述,您的问题非常不完整,因为它没有说明时间戳、CRL 和 CRL 上的时间戳。