签署pdf时出现“定义签名数据范围的意外字节范围值” 第一个示例文档第二示例文档评论

问题描述

我使用了该库的修改版本:https://github.com/vbuch/node-signpdf#readme在有角度的应用程序中使用在其他地方创建的签名对pdf进行签名。当我使用foxit阅读器打开签名的pdf时,签名无效,并显示以下消息:

意外的字节范围值定义了签名数据的范围

任何想法可能是什么问题?

这是文件https://drive.google.com/file/d/1eS2waysotpAx6VtHMNvhGvl3wqgiyoT7/view?usp=sharing

解决方法

第一个示例文档

我无法使用first example document重现“定义签名数据范围的意外字节范围值”错误消息,Foxit“仅仅”抱怨签名无效。确实是因为您在将签名字符串注入PDF之前忘记了对base64解码,所以PDF需要DER格式的嵌入式签名容器。

第二示例文档

在评论中分享了second example document

现在,我不再遇到有关字节范围的错误,但是出现了新错误:“自从应用签名以来,文档已被更改或损坏。和“签名者的身份无效,因为它已过期或尚未生效。”和“签名包括嵌入式时间戳,但无法验证。”不确定我现在是否正确执行操作。这是新文件:https://drive.google.com/file/d/1vsa7thwCsi04r68cdcIsfJG7cT2__-d9/view?usp=sharing

实际上,签名容器现在以DER格式注入,因此Foxit Reader可以对其进行验证。关于新的错误消息:

“自应用签名以来,文档已被更改或损坏。” -这表明此处存在一些摘要值不匹配。

计算并提取出有问题的摘要值表明文档的带符号字节范围的SHA256摘要值是

6CB28A1F84A85A820908B657A967BFE21C1BA7304D39AE2C8D64F9A15E5BFDB4

在签名容器中的消息摘要属性成立的同时

75C31E9E948D41DE19F668CF4A5BE28128CB0BE8D1E4502A795FF9CA9FE54639

因此您的签名确实与签名的字节范围不匹配。

但是,有趣的是,这与第一个文件中的签名容器中签名的摘要完全相同。实际上,整个签名容器是相同的。显然,您只是简单地重用了先前测试中检索到的签名容器。由于新文档中的签名时间不同,因此无法正常工作,因此,您必须重新计算已签名字节范围的摘要,并为其请求签名。

话虽如此,即使对于您的第一个文档,摘要也不正确。因此,您显然在计算摘要值时遇到问题。

“签名者的身份无效,因为它已过期或尚未生效。” 即使在手动更新Foxit Reader之后,我也没有收到该错误消息。首先,我被告知证书没有链接到信任锚,并且在明确信任根证书之后,我得到一个“签名者的身份有效”的信息。您是否选择了一些非标准设置在您的福昕阅读器中?还是您的本地计算机的日期完全关闭了?

“签名包含嵌入式时间戳,但无法验证。” 我也知道了,但是在这里,我只需要信任TSA证书的根证书即可继续。

评论

在评论中您要求:

我在哪里可以找到签名中的消息摘要属性?

邮件摘要属性是签名容器中单个SignerInfo的签名属性。

如果您使用ASN.1查看器(例如http://lapo.it/asn1js/)检查签名容器,请查找

SEQUENCE (2 elem)
  OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
  SET (1 elem)
    OCTET STRING (32 byte) 75C31E9E948D41DE19F668CF4A5BE28128CB0BE8D1E4502A795FF9CA9FE54639

如果您想了解所见内容的详细信息,则应研究RFC 5652及其引用的规范。

我如何明确信任根证书?

对于Foxit Reader中的签署者证书,打开“签名属性” 对话框,选择“显示证书” ,选择要信任的证书(根CA /中间CA /终端实体) ),打开信任标签,然后按添加到受信任的证书

对于Foxit Reader中的TSA证书,打开“签名属性” 对话框,在底部按 Advanced Properties ,在“时间戳记”中选择 Show Certificate 。详细信息,选择要信任的证书(根CA /中间CA /终端实体),打开信任选项卡,然后按添加到受信任的证书