"Unexpected byte range values defining scope of signed data" 签署 pdf 时

"Unexpected byte range values defining scope of signed data" when signing a pdf

我使用此库的修改版本:https://github.com/vbuch/node-signpdf#readme 在 angular 应用程序中使用在别处创建的签名对 pdf 进行签名。当我用 foxit reader 打开签名的 pdf 时,签名无效并显示以下消息:

Unexpected byte range values defining scope of signed data

知道问题出在哪里吗?

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

第一个示例文档

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

第二个示例文档

second example document 已在评论中分享:

Now I don't get the error about the byte range anymore but I get new errors: "The document has been altered or corrupted since the Signature was applied." and "The Signer's identity is invalid because it has expired or is not yet valid." and "The signature includes an embedded timestamp but it could not be verified." Not sure if I'm doing it correctly now. This is the new file: https://drive.google.com/file/d/1vsa7thwCsi04r68cdcIsfJG7cT2__-d9/view?usp=sharing

确实,签名容器现在是以DER格式注入的,所以Foxit Reader可以验证它。关于新的错误信息:

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

计算和提取有问题的摘要值显示文档的带符号字节范围的 SHA256 摘要值为

6CB28A1F84A85A820908B657A967BFE21C1BA7304D39AE2C8D64F9A15E5BFDB4

而签名容器中的消息摘要属性保持

75C31E9E948D41DE19F668CF4A5BE28128CB0BE8D1E4502A795FF9CA9FE54639

所以您的签名确实与带符号的字节范围不匹配。

不过,有趣的是,这与第一个文件中签名容器中签名的摘要完全相同。实际上整个签名容器是相同的。显然,您只是重新使用了为之前的测试检索到的签名容器。由于新文档中的签名时间不同,这不起作用,但您必须重新计算签名字节范围的摘要并为其请求签名。

也就是说,即使对于您的第一份文档,摘要也不正确。所以你显然在计算摘要值时遇到了问题。

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

“签名包含嵌入式时间戳,但无法验证。” 我也明白了,但在这里我再次只需要信任 TSA 的根证书证书开始。

评论

在您提出的评论中:

Where can I find the message digest attribute in the signature?

消息摘要属性是签名容器中单个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 和那里引用的规范。

And how can I explicitly trust the root certificate?

对于福昕 Reader 中的签名者证书,打开 签名属性 对话框,select 显示证书, select 您要信任的证书(根 CA/中间 CA/最终实体),打开 Trust 选项卡,然后按 Add to Trusted Certificates.

对于 Foxit 中的 TSA 证书 Reader 打开 签名属性 对话框,在底部按 高级属性 ,select Show Certificate in the Timestamp Details,select你要信任的证书(根CA/中间CA/终端实体),打开 Trust 选项卡,然后按 Add to Trusted Certificates