2016-04-13 88 views
0

我有一个带签名字节的数组和一个带ocsp字节的数组,以便将ltv信息添加到我的pdf中。签名是时间戳签名。现在,我尝试将此信息添加到PDF文件与用iText添加单独的签名和单独的ocsp字节到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(); 

OK,这个工程。但在签名我必须设置标志认证级别1(不允许更改),我的应用程序将无法工作。因为添加LTV我会更改文档。我尝试创建自己的DSS字典并将其添加到我的文档中,但失败了。 任何人都可以帮忙吗?在此先感谢

回答

0

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

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

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

(*),还有第四个类型,称为使用权签名,但 将在PDF 2.0被弃用。

来源:题为ISO 32000-2(草案)

你是在谈论一个文件时间戳签名的“数字签名”部分12.8题为“常规”部分12.8.1(添加LTV的原因),但你也在谈论DocMDP(MDP代表修改检测和预防)。

MDP仅可用于认证签名:

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

来源:题为 “DocMDP” ISO 32000-2

授予(草案)第12.8.2.2题为 “常规” 部分12.8.2.2.1,你可以添加一个参考进入包含“签名参考字典数组”的签名字典。

签名参考词典可以具有TransformMethod条目与值:

  • DocMDP:用于检测修改以相对于签名字段的文档由文档的始发签署。
  • FieldMDP:用于检测对TransformParams中指定的表单字段列表的修改。

来源:表259“项中的签名参考词典”,在ISO 32000-1

第12.8.1如果MDP是你想要的,你可以在以下情况下使用DocMDP认证签名,以及其他签名情况下的FieldMDP。但是,如果我们看看引用条目表255:签名字典中的条目,我们看到“如果SubFilter是ETSI.RFC3161,则不应使用此条目。”

换句话说,您不能拥有DocMDP或FieldMDP for Document时间戳。这是一种正常的,因为我们在阅读部分章节12.8.5.1 12.8.5的“常规”,“文件时间戳(DTS)大辞典”:

的文件时间戳词典建立的确切内容在时间戳记标记中指定的时间完整的PDF文件。

它没有说任何关于将标志设置为“认证等级1(不允许更改)”的能力。这不是文档时间戳记的用途。代码失败是正常的。

设置认证级别只能在第一次签名时完成,以防签名为认证签名。无论谁告诉你使用文档时间戳签名(ETSI.RFC3161)设置认证级别,都要求您根据即将颁布的PDF 2.0标准做一些不可能的事情。

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

+0

布鲁诺,非常感谢这个详细的答案! – FenFen