关于pdf:数字签名/电子签名验证失败

Digital Signature/ eSign verification fails

我有一个eSigned /经过数字签名的PDF,使用iText lib在分离的签名中对该文档进行了签名。我在验证签名时遇到问题,收到消息"签名人身份无效,因为它已过期或尚未生效",并且在签名人信息中"构建从签名人证书到颁发者证书的路径时出错。"

我尝试了多种方法来验证签名,但未成功。如果我将签名者证书明确添加为受信任的证书,那么我会获得绿色的勾号并能够验证签名,但是我认为那不是正确的方法。

Adob??e Signature设置如下:-
signature

数字签名的pdf可以在此处找到数字签名的文档

任何人都可以帮助解决此问题。


I have tried many ways to validate the signature but couldn't get any success.

这并不奇怪:您的签名无效。在PDF签名字段值中,签名时间为格林尼治标准时间2020/06/11 09:28:35,但您的签名者证书有效期仅在格林尼治标准时间2020/06/11 09:29:44之前,而不是在2020/06/11 09之后格林尼治标准时间:59:44。因此,在声明的签名时间,您的签名者证书尚未生效,并且无法创建有效的签名。

显然,您使用签名服务进行签名,该服务会在您的签名请求到达时及时创建一个短期证书。不幸的是,这是在iText在签名过程开始时作为签名时间存储在PDF中之后的时间。

因此,解决此问题的一种方法是告诉iText将来使用一点时间(例如两分钟)。

您可以通过PdfSignatureAppearance方法setSignDate来做到这一点。

您的签名实际上还违反了规范中的建议:仅当签名(嵌入式签名容器)中的签名时间不可用时,才应使用存储在签名字段值字典中的上述签名时间。但是,在您的情况下,嵌入式签名容器确实包含一个值为11/06/2020 09:29:44 GMTsigningTime签名属性,该属性不在证书有效期开始之前。

这仅是一个建议,因此具有两个签名时间值不会使您的PDF签名无效。但是由于值不同,这可能导致不同的验证者使用一个或另一个值产生不同的验证结果。

因此,解决此问题的另一种方法是确保根本没有将签名时间值添加到签名值字典中。此外,这还使您签名的PDF遵循上面的建议,因此更加精确。

不幸的是,使用PdfSignatureAppearance方法setSignDate设置null值不起作用,稍后在签名过程中这会导致NullPointerException出现。但是,如果在签名代码中使用自定义的ExternalSignatureContainer实现(而不是ExternalSignature实现),则可以在modifySigningDictionary实现中删除该条目。密钥是PdfName.M

顺便说一句,由于您的签名证书仅有效半小时,如果验证者的验证策略仅信任数字时间戳,而不信任不安全的日期时间值,则验证者也可以拒绝该证书。

因此,您应该在证书的有效期内添加吊销信息并为整个结构添加数字时间戳,以确保长期验证。