数字签名/电子签名验证失败
Posted
技术标签:
【中文标题】数字签名/电子签名验证失败【英文标题】:Digital Signature/ eSign verification fails 【发布时间】:2020-10-01 00:27:19 【问题描述】:我有一个电子签名/数字签名的 PDF,该文档是使用 iText lib 在分离签名中签名的。我在验证签名时遇到问题,收到消息“签名者身份无效,因为它已过期或尚未有效”,并且在签名者信息中“构建从签名者证书到颁发者证书的路径时出错。”
我尝试了很多方法来验证签名,但都没有成功。如果我明确地将签署者证书添加为受信任的证书,那么我会得到一个绿色检查并能够验证签名,但我认为这不是正确的方法。
Adobe 签名设置如下:-
数字签名的 pdf 可以在这里找到digitally signed document
谁能帮忙解决这个问题。
【问题讨论】:
【参考方案1】:我尝试了很多方法来验证签名,但都没有成功。
这并不奇怪:您的签名无效。在 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
来做到这一点。
您的签名实际上也违反了规范中的一个建议:上述存储在签名字段值字典中的签名时间应该仅在签名时间不可用时使用签名(嵌入的签名容器)。但是,在您的情况下,嵌入式签名容器确实包含一个 signingTime
签名属性,其值为 11/06/2020 09:29:44 GMT
,它在证书有效期开始之前不是。
这只是一个建议,您的 PDF 签名不会因具有两个签名时间值而无效。但由于值不同,这可能会导致不同验证者使用一个值或另一个值产生不同的验证结果。
因此,解决此问题的另一种方法是确保根本没有将签名时间值添加到签名值字典中。这还使您签名的 PDF 跟随上面的建议,所以更准确。
不幸的是,使用PdfSignatureAppearance
方法setSignDate
设置null
值不起作用,稍后在签名过程中会导致NullPointerException
出现。但是,如果您在签名代码中使用自定义的ExternalSignatureContainer
实现(而不是ExternalSignature
实现),您可以在modifySigningDictionary
实现中删除该条目。密钥是PdfName.M
。
顺便说一句,由于您的签名证书仅在半小时内有效,如果他们的验证策略只信任数字时间戳,而不是不安全的日期时间值,验证者也可能会拒绝它。
因此,您应该在证书的生命周期内添加吊销信息并为整个构造添加数字时间戳,以确保长期验证。
【讨论】:
非常感谢您如此详细地解释问题,现在清楚地了解我做错了什么。您建议的第一种方法可以作为快速修复,但第二种方法看起来更完美。我还想添加嵌入式签名容器签名时间和签名者信息,因为我也没有提前签名者姓名,因为外部唱歌服务仅返回带有签名响应的公共证书。是否可以使用 ExternalSignatureContainer 来实现这一点,如果可以,任何示例代码 sn-p 都会有所帮助。 @mlk 外部签名服务不提供吊销信息,因为证书仅用于一次签名,如何在没有吊销信息的情况下处理长期验证。有什么方法可以纠正已经签名的文档(如他的帖子中所附)的问题,并从嵌入式签名容器中设置签名时间,而不是在签名前出现的一组。据我所知,这是不可能的,这听起来可能是一个愚蠢的疑问,但请澄清。谢谢:) “有什么办法可以纠正已经签名的文档的问题” - 如果可以在不再次签名的情况下更改签名的相关属性,签名方案一毛钱都不值。您的签名无效(或至少在一种无效的解释下模棱两可)。句号。要获得没有无效解释的签名,您需要再次签名(或说服标准化委员会更改标准以使您的签名明确有效)。 “外部签名服务不提供撤销信息,因为证书仅用于一次签名” - 如果这些签名应由Adobe 阅读器等标准组件。验证者应该如何知道?验证者必须假设任何常规签名证书都可以随时撤销。因此,它需要能够检查吊销状态。我确实知道一些类似的服务会连同签名一起返回相关的撤销信息。否则 crls 或 ocsp 响应者是必须的。 “我还想添加嵌入式签名容器签名时间和签名者信息” - 停止。我说你可以阻止 itext 设置自己的签名时间。但并不是说您可以更改任何以前的信息。例如。如果您在签名可视化中有信息,通常只能使用 Adobe 阅读器进行更改,至少显示警告信息已更改。【参考方案2】:我了解您的问题。有一种全新的解决方法,只需 3 个步骤。
-
在 Adobe Acrobat DC 或您拥有的任何 Adobe pdf 编辑器软件中打开。
在编辑中,进入首选项,最后进入签名。点击验证,更多,在验证时间部分,选择当前时间。相同的位置,验证信息部分,选择从不。
在 Windows 集成中,勾选验证签名和验证认证文档。点击确定。
关闭所有弹出窗口。回到签名区,右键选择,验证签名。 完成✅
【讨论】:
像这样更改验证设置可能会使您的 Acrobat 应用程序积极验证该签名。但通常重要的不是您的 Adobe 应用程序,而是您签名文档的收件人 的验证器。为什么他们要像那样扭曲他们的验证器的配置?以上是关于数字签名/电子签名验证失败的主要内容,如果未能解决你的问题,请参考以下文章
C# 如何验证来自电子邮件的数字签名(编码 SeveBit)
每日随笔电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )