问题描述
我使用了该库的修改版本: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 /终端实体),打开信任选项卡,然后按添加到受信任的证书。