验证数字多重签名PDF

时间:2017-08-21 22:41:40

标签: itext signature sign

我需要想要与以下问题的解决方案合作的人的帮助,我正在使用ITEXT验证PDF的数字签名,这非常有效,我无法验证签名的问题是当我有2个签名,第一个是无效的,如Adobe Acrobat所示,但是使用itext的例子认为它是有效的,有些帮助吗?

1 个答案:

答案 0 :(得分:2)

首先,由于第一个签名修订的签名字节发生了更改,但是由于第二个签名修订版的增量更新部分中添加了一些内容,Adobe Reader会抱怨签名变为无效它认为是不允许的。

iText和PDFBox(最初也在问题的标签中都提到过)都没有在标准签名验证码中检查。因此,即使不允许添加有问题,iText和PDFBox签名验证代码都不会认识到这一点。

实际上我不知道除了Adobe Acrobat / Adob​​e 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 字典对象的副本;可能是有人测试的标志。虽然该对象未被引用,但,它不会打扰任何检查......)