处理数字签名比我们乍看之下想象的要复杂得多。
您的情况是正确的:如果您没有签名日期/时间的证明,则无法确定在证书吊销和到期后还没有完成。您还可以注意到,即使证书没有被吊销,在证书到期后进行的签名也不应被视为有效。
第一个解决方案
为软件签名添加时间戳。这个时间戳称为签名时间戳。此时间戳提供了签名在给定日期存在的证明。它证明签名是在证书到期之前计算的。但这并没有解决第二个问题:如果证书被吊销了怎么办?
第二种解决方案
除了签名时间戳之外,您还可以将 CRL(或 OCSP 响应)的副本附加到签名中。它将证明在生成签名时证书没有被吊销。
但时间戳令牌和 CRL 也是签名对象。它们也需要得到验证。那么,我们是否也应该获得证明签名时间戳已由有效证书签名的 CRL?简短的回答:是的,事情似乎变得更加复杂。
第三个解决方案
一些签名标准(如CAdES)提出了更好的解决方案:连同签名时间戳,您应该收集离线验证签名所需的所有项目(即能够验证证书而无需下载任何其他对象) . 它包括所有中间 CA 证书和 CRL。这不是一个无止境的过程,因为您最终会到达一个或多个受信任的根 CA,但它可能非常复杂(请注意,一个好的 X.509 验证算法应该输出所有这些项目以及证书的有效性状态)。在获取所有这些对象之后,您必须在其上加上时间戳。这个时间戳称为归档时间戳
现在签名验证过程如下:
- 您在线验证全局时间戳。这意味着您下载所有必要的元素以确保时间戳签名有效。现在您有证据证明所有封闭对象 (CRL...) 在存档时间戳日期存在。
- 您仅使用存档时间戳涵盖的元素离线验证签名,就好像当前日期是存档时间戳的日期一样。
使用此解决方案,您所呈现的场景是不可能的,因为签名验证者在签名之日拥有证书到期和有效性状态的证明。
该解决方案目前正在实施以验证长期文档签名,但不幸的是,据我所知,不适用于代码签名验证。如今,供应商正在使用其他机制,例如被盗证书黑名单,这些机制更易于实施。
2014 年 9 月 25 日更新(阅读@maureen 评论后)
首先,您对流程的理解是正确的:由于每个证书都在到期日期之后从 CRL 中删除,因此您无法评估过去是否已撤销证书。因此,在证书到期后无法验证签名。
但即使证书已被泄露(或仅仅因为客户丢失了他的 USB 加密令牌而被撤销),之前创建的所有签名都应被视为有效。我在回答中描述的过程试图解释如何在今天(即即使在证书到期之后)回答这个问题:“签名是否有效,如果它被创建”。