第一个示例文档
我无法在第一个示例文档中重现“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 Properties,Show Certificate在时间戳详细信息中选择,选择您要信任的证书(根 CA/中间 CA/最终实体),打开Trust选项卡,然后按Add to Trusted Certificates。