2017-08-21 66 views
0

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

+0

*“第一个无效”* - 由于哪个原因?由于第一次修订的签名字节发生了变化,还是因为以后的修订版本中不允许发生更改? iText和pdfbox都会认可前者,而不会检查后者。 – mkl

回答

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 Dictionary对象等价版本,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中还有一个字典对象的直接拷贝;可能是某人测试的标志,因为该对象没有被引用,但是它没有被引用打扰任何检查...)

+0

顺便说一句,'Con firma fallada.pdf'和'Con firma buena.pdf'都有一些不好的地方:它们都使用与第一次签名修订相同的文件标识符ID。这违反了PDF规范中的建议。 – mkl

+0

嘿嘿,剥离fallada文件的第二个签名和使用PDFBox签名工作没有Adobe抱怨。如果使用PDFBox,那么它一定是旧版本。因为一年前我们遇到了类似的问题:https://issues.apache.org/jira/browse/PDFBOX-3114 –

+0

@TilmanHausherr是的,我的脑海里还有一个旧的PDFBox问题(我刚刚发现它[这里](https://stackoverflow.com/a/19905271/1729265))其中PDFBox用于做一些更改导致等效结构(另外引入一些舍入错误)。哦,我发现你的问题也提到了这个问题。 – mkl