数字签名/电子签名验证失败
Digital Signature/ eSign verification fails
我有一个电子签名/数字签名的 PDF,文档是使用分离签名中的 iText 库签名的。我在验证签名、获取消息 "signers identity is invalid because it has expired or not yet valid" 和签名者信息 "There were errors building the path from signers certificate to an issuer certificate."
时遇到问题
我尝试了很多方法来验证签名,但都没有成功。如果我明确地将签名者证书添加为可信证书,那么我会得到一个绿色复选标记并能够验证签名,但我认为这不是正确的方法。
Adobe Signature 设置如下:-
可以在此处找到经过数字签名的 pdfdigitally signed document
任何人都可以帮助解决这个问题。
I have tried many ways to validate the signature but couldn't get any success.
这并不奇怪:您的签名无效。在 PDF 签名字段值中有一个签名时间 2020/06/11 09:28:35 GMT 但您的签名者证书在 2020/06/11 09:29:44 GMT 之前有效并且不在 2020/06/11 09:59:44格林威治标准时间。因此,在声明的签名时间,您的签名者证书尚未生效,无法创建有效签名。
显然,您使用签名服务进行签名,该服务会在您的签名请求到达时及时创建短期证书。不幸的是,这是在签名过程开始时 iText 在 PDF 中存储为签名时间之后的时间。
因此,解决问题的一种方法是告诉 iText 在未来稍微使用一个时间(例如两分钟)。
您可以通过 PdfSignatureAppearance
方法 setSignDate
。
你的签名其实也违反了规范中的一个建议:上述签名字段值字典中存储的签名时间应该只在需要时使用signature(嵌入式签名容器)中没有签名。但是,在您的情况下,嵌入式签名容器确实包含一个 signingTime
signed 属性,其值为 11/06/2020 09:29:44 GMT
,在证书有效性开始之前 not。
由于这只是一个建议,您的 PDF 签名不会因具有两个签名时间值而变得无效。但是由于值不同,这可能会导致不同验证器使用一个或另一个值得出不同的验证结果。
因此,另一种解决问题的方法是确保根本没有将签名时间值添加到签名值字典中。 这还会使您签名的 PDF 遵循上述建议,因此更加精确。
不幸的是,使用 PdfSignatureAppearance
方法 setSignDate
设置 null
值不起作用,稍后在签名过程中会导致 NullPointerException
发生。但是,如果您在签名代码中使用自定义 ExternalSignatureContainer
实现(而不是 ExternalSignature
实现),则可以在 modifySigningDictionary
实现中删除该条目。关键是PdfName.M
.
顺便说一句,由于您的签名证书仅在半小时内有效,如果他们的验证策略只信任数字时间戳,而不信任不安全的日期时间值,验证器也可能会拒绝它。
因此,您应该添加吊销信息并在证书的生命周期内为整个构造添加数字时间戳,以保证长期有效。
我明白你的问题是什么。有一种全新的解决方法,只需 3 个步骤。
- 在 Adobe Acrobat DC 或您拥有的任何 Adobe pdf 编辑器软件中打开。
- 在编辑中,转到首选项,最后来到签名。点击验证,更多,在验证时间部分,select当前时间。相同位置,验证信息部分,select从不。
- 在Windows集成中,勾选验证签名和验证认证文件。点击确定。
关闭所有弹出窗口。回到签名区右击select,验证签名。
完成 ✅
我有一个电子签名/数字签名的 PDF,文档是使用分离签名中的 iText 库签名的。我在验证签名、获取消息 "signers identity is invalid because it has expired or not yet valid" 和签名者信息 "There were errors building the path from signers certificate to an issuer certificate."
时遇到问题我尝试了很多方法来验证签名,但都没有成功。如果我明确地将签名者证书添加为可信证书,那么我会得到一个绿色复选标记并能够验证签名,但我认为这不是正确的方法。
Adobe Signature 设置如下:-
可以在此处找到经过数字签名的 pdfdigitally signed document
任何人都可以帮助解决这个问题。
I have tried many ways to validate the signature but couldn't get any success.
这并不奇怪:您的签名无效。在 PDF 签名字段值中有一个签名时间 2020/06/11 09:28:35 GMT 但您的签名者证书在 2020/06/11 09:29:44 GMT 之前有效并且不在 2020/06/11 09:59:44格林威治标准时间。因此,在声明的签名时间,您的签名者证书尚未生效,无法创建有效签名。
显然,您使用签名服务进行签名,该服务会在您的签名请求到达时及时创建短期证书。不幸的是,这是在签名过程开始时 iText 在 PDF 中存储为签名时间之后的时间。
因此,解决问题的一种方法是告诉 iText 在未来稍微使用一个时间(例如两分钟)。
您可以通过 PdfSignatureAppearance
方法 setSignDate
。
你的签名其实也违反了规范中的一个建议:上述签名字段值字典中存储的签名时间应该只在需要时使用signature(嵌入式签名容器)中没有签名。但是,在您的情况下,嵌入式签名容器确实包含一个 signingTime
signed 属性,其值为 11/06/2020 09:29:44 GMT
,在证书有效性开始之前 not。
由于这只是一个建议,您的 PDF 签名不会因具有两个签名时间值而变得无效。但是由于值不同,这可能会导致不同验证器使用一个或另一个值得出不同的验证结果。
因此,另一种解决问题的方法是确保根本没有将签名时间值添加到签名值字典中。 这还会使您签名的 PDF 遵循上述建议,因此更加精确。
不幸的是,使用 PdfSignatureAppearance
方法 setSignDate
设置 null
值不起作用,稍后在签名过程中会导致 NullPointerException
发生。但是,如果您在签名代码中使用自定义 ExternalSignatureContainer
实现(而不是 ExternalSignature
实现),则可以在 modifySigningDictionary
实现中删除该条目。关键是PdfName.M
.
顺便说一句,由于您的签名证书仅在半小时内有效,如果他们的验证策略只信任数字时间戳,而不信任不安全的日期时间值,验证器也可能会拒绝它。
因此,您应该添加吊销信息并在证书的生命周期内为整个构造添加数字时间戳,以保证长期有效。
我明白你的问题是什么。有一种全新的解决方法,只需 3 个步骤。
- 在 Adobe Acrobat DC 或您拥有的任何 Adobe pdf 编辑器软件中打开。
- 在编辑中,转到首选项,最后来到签名。点击验证,更多,在验证时间部分,select当前时间。相同位置,验证信息部分,select从不。
- 在Windows集成中,勾选验证签名和验证认证文件。点击确定。
关闭所有弹出窗口。回到签名区右击select,验证签名。 完成 ✅