使用iText将单独的签名和单独的ocsp字节添加到PDF

时间:2016-04-13 14:13:36

标签: java pdf itext signature

我有一个带有签名字节的数组和一个带有ocsp字节的数组,用于将ltv信息添加到我的pdf中。签名是时间戳签名。现在我尝试将此信息添加到与

一起使用的pdf文件中
//add signature
PdfLiteral pdfLiteral = (PdfLiteral) pdfSignature.get( PdfName.CONTENTS );
byte[] outc = new byte[ ( pdfLiteral.getPosLength( ) - 2 ) / 2 ];
Arrays.fill( outc, (byte) 0 );
System.arraycopy( externalSignature, 0, outc, 0, externalSignature.length );
PdfDictionary dic2 = new PdfDictionary( );
PdfString pdfString = new PdfString( outc ).setHexWriting( true );
dic2.put( PdfName.CONTENTS, pdfString );

pdfSignatureAppearance.close( dic2 );

...

//add LTV
for ( String sigName : stamper.getAcroFields( ).getSignatureNames( ) ) {
        addVerification = validation.addVerification(
                sigName, // Signature Name
                ocspColl, // OCSP
                crlColl, // CRL
                null // certs
        );
    }

validation.merge( );
stamper.close( );

好的,这很有效。但在签名中我必须设置标志认证级别1(不允许更改),我的应用程序将无法正常工作。因为添加LTV我改变了文档。我尝试创建自己的DSS字典并将其添加到我的文档但它失败了。 有人可以提供帮助吗?提前致谢

1 个答案:

答案 0 :(得分:0)

作为ISO-32000-2的ISO委员会成员,我可以访问规范,所以请允许我解释一些事情。

  

PDF文档中可以有三种类型的签名(*):

     
      
  • 最多一个认证签名(又名作者签名),
  •   
  • 一个或多个批准签名(又名收件人签名),
  •   
  • 任意数量的文档时间戳签名(SubFilter值为ETSI.RFC3161)。
  •   
     

(*)有第四种类型,称为使用权签名,但是   这将在PDF 2.0中弃用。

     

资料来源:第12.8.1节题为"一般"在第12.8节标题为"数字签名" ISO 32000-2(草案)

您正在谈论文档时间戳签名(由于LTV原因而添加),但您也在谈论DocMDP(MDP代表修改检测和预防)。

MDP仅适用于认证签名:

  

DocMDP转换方法应用于检测修改   相对于由作者签名的签名字段   文件(申请认证签名的人)。一个文件   只能包含一个包含DocMDP转换的签名字段   方法。它使作者能够指定应该进行哪些更改   允许对文档进行更改以及哪些更改使文档无效   作者的签名。

     

来源:第12.8.2.2.1节题为"一般"在第12.8.2.2节题为" DocMDP" ISO 32000-2(草案)

当然,您可以在包含"签名参考词典数组"的签名词典中添加参考条目。

签名参考字典可以包含 TransformMethod 条目,其值为:

  
      
  • DocMDP:用于检测文档相对于文档创建者签名的签名字段的修改。
  •   
  • FieldMDP:用于检测对TransformParams中指定的表单字段列表的修改。
  •   
     

来源:表259"签名参考字典中的条目"在ISO 32000-1的第12.8.1节中

如果MDP是您想要的,您可以在认证签名的情况下使用DocMDP,在其他签名的情况下使用FieldMDP。但是,如果我们查看表255:签名词典中的条目中的参考条目,我们会看到"如果SubFilter是ETSI.RFC3161,则此条目应为不被使用。"

换句话说,您无法使用DocMDP或FieldMDP作为文档时间戳。这是正常的,因为正如我们在第12.8.5.1节中所述,"一般"第12.8.5节"文件时间戳(DTS)字典":

  

文档时间戳字典在时间戳令牌中指示的时间建立完整PDF文件的确切内容。

它没有说明将标志设置为"认证级别1(不允许更改)"的能力。这不是文档时间戳的用途。代码失败是正常的。

如果签名是证书签名,则只能使用第一个签名设置认证级别。无论谁告诉您使用文档时间戳签名(ETSI.RFC3161)设置认证级别,都要求您根据即将推出的PDF 2.0 ISO标准做一些不可能的事情。

如果您的后续问题是:那么如何在ISO 32000-1中完成,那么答案很简单:文档时间戳签名在ISO 32000-1中不存在。