可能重复:对
PDF文件进行数字签名
在应用程序中,用户将上载PDF文件,然后上传使用数字笔创建的个人签名.如何在pdf文件中嵌入此签名?
我有一个用 C 编写的 PDF 生成器,现在我想为其添加数字签名。我从一个最小的 PDF 开始,使用JSignPdf对其进行签名,现在尝试使用我自己的程序来生成 Adobe Acrobat Reader 能够进行相同解释的文件。我已经检查了数字签名 PDF 文件问题,但那里的评论似乎得出结论,应该使用 iText 而不是尝试自己做。我不想要这样。
更新: 我确实还阅读了 1.7 的 PDF 参考和下面链接的“32000”规范,但有时我会因为参考的数量而感到有点迷失。从一个工作示例开始通常是我理解所有内容如何组合在一起的最简单方法。抱歉,我在最初的帖子中没有明确说明这一点。
我已让 Acrobat Reader 确认文件中有签名,但仍有问题。在签名面板中,它显示“由未知签名”,而不是使用密钥中的正确名称。打开“签名属性”时,显示“此签名无效,因为此签名中包含的格式或信息存在错误”。在“高级签名属性”上,哈希算法为“不可用”。
根据 Acrobat Reader,JSignPdf 中的 PDF 是正确的。在告诉它接受我的自签名证书后,它会显示一个漂亮的绿色签名复选框。为了找到所需的最少添加内容,我清除了一个又一个 PDF 标签,并小心翼翼地不更改剩余标签的偏移量。这会给出与上面相同的“此签名无效...”错误消息,但它仍然显示“签名者的身份有效”,并将哈希算法显示为“SHA1”。
问题是造成这种差异的原因是什么,是否有任何工具可以更详细地解释错误所在?
在 /Type/Catalog 字典中,我有一个 /AcroForm。我尝试过将其放在适当的位置并作为参考,但这没有什么区别。/AcroForm 包含 /SigFlags 3 和 /Fields [ x 0 R ],其中 x 是带有 /Subtype/Widget 的 /Type/Annot 的 id。(“endobj”被移动到“>>”行以节省一些空间。)
更新:有一些词典,尽管我现在不记得它们的名字,其中“就地”与“参考”很重要。特别是1.7规范中的实现说明中有一些这样的内容,以及一些“规范说这个字段是可选的,但实际上它是必需的”。
2 0 obj <<
/Type /Catalog
/Pages 3 0 R
/AcroForm <<
/Fields [ 8 0 R ]
/SigFlags …Run Code Online (Sandbox Code Playgroud)