我需要想要与以下问题的解决方案合作的人的帮助,我正在使用ITEXT验证PDF的数字签名,这非常有效,我无法验证签名的问题是当我有2个签名,第一个是无效的,如Adobe Acrobat所示,但是使用itext的例子认为它是有效的,有些帮助吗?
答案 0 :(得分:2)
首先,由于第一个签名修订的签名字节发生了更改,但是由于第二个签名修订版的增量更新部分中添加了一些内容,Adobe Reader会不抱怨签名变为无效它认为是不允许的。
iText和PDFBox(最初也在问题的标签中都提到过)都没有在标准签名验证码中检查。因此,即使不允许添加有问题,iText和PDFBox签名验证代码都不会认识到这一点。
实际上我不知道除了Adobe Acrobat / Adobe Reader之外的任何PDF产品是否试图检查是否禁止对签名PDF的增量更新中添加。
话虽如此,即使Adobe在这方面的测试也不是很好:当他们检查是否允许某些更改时,他们通常会检查更改是否以Adobe将执行允许更改的方式执行。因此,如果您以不同的方式进行某些允许的更改,Adobe可能会声称不允许更改。
示例文档Con firma fallada.pdf
中也是如此。
在第一个签名修订版中,PDF 目录对象看起来像这样(漂亮打印):
1 0 obj
<<
/Type/Catalog
/ViewerPreferences 2 0 R
/Pages 29 0 R
/AcroForm
<<
/DA(/Helv 0 Tf 0 g )
/Fields[32 0 R]
/SigFlags 3
/DR<</Font<</Helv 33 0 R/ZaDb 34 0 R>>>>
>>
/Outlines 3 0 R
>>
endobj
在第二个签名修订的增量更新中,添加了一个额外的签名字段,因此必须重写该对象。签名软件还将直接 AcroForm 字典对象重构为新的间接对象:
1 0 obj
<<
/Pages 29 0 R
/AcroForm 35 0 R
/Type /Catalog
/ViewerPreferences 2 0 R
/Outlines 3 0 R
>>
endobj
35 0 obj
<<
/DA (/Helv 0 Tf 0 g )
/DR << /Font << /Helv 33 0 R/ZaDb 34 0 R >> >>
/Fields [ 32 0 R 36 0 R ]
/SigFlags 3
>>
endobj
有了这个,Adobe声称不允许更改。
如果使用直接 AcroForm 字典对象替换上述等效版本,Adobe不再声明不允许更改:
1 0 obj
<<
/Pages 29 0 R
/AcroForm
<<
/DA (/Helv 0 Tf 0 g )
/DR << /Font << /Helv 33 0 R/ZaDb 34 0 R >> >>
/Fields [ 32 0 R 36 0 R ]
/SigFlags 3
>>
/Type /Catalog
/ViewerPreferences 2 0 R
/Outlines 3 0 R
>>
endobj
顺便说一句,这正是目录在Con firma buena.pdf
中第二个签名的增量更新中的样子。
(奇怪的是,在该文件中还有间接对象35中的直接 AcroForm 字典对象的副本;可能是有人测试的标志。虽然该对象未被引用,但,它不会打扰任何检查......)