2

我在一个角度应用程序中使用这个库的修改版本:https ://github.com/vbuch/node-signpdf#readme来签署一个带有在其他地方创建的签名的pdf。当我使用 foxit reader 打开签名的 pdf 时,签名无效并显示以下消息:

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

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

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

4

1 回答 1

2

第一个示例文档

我无法在第一个示例文档中重现“Unexpected byte range values defined scope of signed data”错误消息,Foxit“只是”抱怨签名无效。这确实是因为您忘记在将签名字符串注入 PDF 之前对其进行 base64 解码 - PDF 需要 DER 格式的嵌入式签名容器。

第二个示例文档

第二个示例文档在评论中共享:

现在我不再收到有关字节范围的错误,但我收到了新错误:“自从应用签名以来,文档已被更改或损坏。” 和“签名者的身份无效,因为它已过期或尚未生效。” 和“签名包含嵌入的时间戳,但无法验证。” 不知道我现在做的是否正确。这是新文件: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和从那里引用的规范。

以及如何明确信任根证书?

对于福昕阅读器中的签名者证书,打开Signature Properties对话框,选择Show Certificate,选择您要信任的证书(根 CA/中间 CA/最终实体),打开Trust选项卡,然后按Add to Trusted Certificates

对于福昕阅读器中的 TSA 证书,打开Signature Properties对话框,在底部按Advanced PropertiesShow Certificate在时间戳详细信息中选择,选择您要信任的证书(根 CA/中间 CA/最终实体),打开Trust选项卡,然后按Add to Trusted Certificates

于 2020-11-16T12:33:40.607 回答