Itext 验证数字多重签名PDF

Itext 验证数字多重签名PDF,itext,signature,sign,Itext,Signature,Sign,我需要有人的帮助,他们希望合作解决以下问题,我正在使用ITEXT验证PDF的数字签名,这非常有效,我无法验证签名的问题是,我有两个签名,第一个签名无效,如Adobe Acrobat所示,但ITEXT的例子认为它是有效的,有一些帮助吗? 开始,Adobe Reader不会因为第一个签名版本的签名字节发生更改而抱怨签名无效,而是因为在第二个签名版本的增量更新部分添加了它认为不允许的内容 iText和PDFBox(最初也在问题标签中提到)都没有在其标准签名验证代码中检查这一点。因此,即使所讨论的添加是

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

开始,Adobe Reader不会因为第一个签名版本的签名字节发生更改而抱怨签名无效,而是因为在第二个签名版本的增量更新部分添加了它认为不允许的内容

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

实际上,我不知道除了AdobeAcrobat/AdobeReader之外,是否有任何PDF产品尝试检查是否不允许在已签名PDF的增量更新中添加内容

这就是说,就连Adobe在这方面的测试也不是很好:当他们检查某些更改是否被允许时,他们通常会检查更改是否以Adobe执行允许更改的方式执行。因此,如果您以不同的方式进行某些允许的更改,Adobe可能会声明不允许的更改


示例文档
confirma fallada.pdf
中也是如此

在第一个签名版本中,PDF目录对象如下所示(打印精美):

10对象
/轮廓30R
>>
endobj
在第二个签名版本的增量更新中,添加了一个额外的签名字段,因此必须重写对象。签名软件还将directAcroFormdictionary对象重构为新的间接对象:

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 
10对象
>
endobj
35 0 obj
>
/字段[32 0 R 36 0 R]
/标志3
>>
endobj
在这种情况下,Adobe声称不允许进行更改

如果使用directAcroFormdictionary对象将上述内容替换为等效版本,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 
10对象
/字段[32 0 R 36 0 R]
/标志3
>>
/类型/目录
/viewerp20r
/轮廓30R
>>
endobj
顺便说一句,这正是目录
confirma buena.pdf
中第二个签名的增量更新中的样子


(但奇怪的是,在该文件中,间接对象35中还有一个directAcroFormdictionary对象的副本;可能是有人在测试的迹象。尽管该对象未被引用,但它不会干扰任何检查…

首先,Adobe Reader不会因为第一个签名版本的签名字节发生更改而抱怨签名无效,而是因为在第二个签名版本的增量更新部分添加了它认为不允许的内容

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

实际上,我不知道除了AdobeAcrobat/AdobeReader之外,是否有任何PDF产品尝试检查是否不允许在已签名PDF的增量更新中添加内容

这就是说,就连Adobe在这方面的测试也不是很好:当他们检查某些更改是否被允许时,他们通常会检查更改是否以Adobe执行允许更改的方式执行。因此,如果您以不同的方式进行某些允许的更改,Adobe可能会声明不允许的更改


示例文档
confirma fallada.pdf
中也是如此

在第一个签名版本中,PDF目录对象如下所示(打印精美):

10对象
/轮廓30R
>>
endobj
在第二个签名版本的增量更新中,添加了一个额外的签名字段,因此必须重写对象。签名软件还将directAcroFormdictionary对象重构为新的间接对象:

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 
10对象
>
endobj
35 0 obj
>
/字段[32 0 R 36 0 R]
/标志3
>>
endobj
在这种情况下,Adobe声称不允许进行更改

如果使用directAcroFormdictionary对象将上述内容替换为等效版本,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 
10对象
/字段[32 0 R 36 0 R]
/标志3
>>
/类型/目录
/viewerp20r
/轮廓30R
>>
endobj
顺便说一句,这正是目录
confirma buena.pdf
中第二个签名的增量更新中的样子

(奇怪的是,在该文件中,间接对象35中还有一个directAcroFormdictionary对象的副本;可能是有人在测试的迹象。尽管该对象未被引用,但它不会干扰任何检查…

“第一个无效”-原因是什么?是因为第一个修订版的签名字节发生了更改,还是因为以后的修订版不允许进行更改?iText和pdfbox都能识别前者,但都不检查后者。“第一个无效”-原因是什么?是因为第一个修订版的签名字节发生了更改,还是因为以后的修订版不允许进行更改?iText和pdfbox都能识别前者,但都不检查后者。顺便说一下,