在PDF更换签名内容(Replace signature content in a PDF)

2019-07-19 18:42发布

如何才能在这的iText做? 我有来自客户端的签名的PDF。 我需要添加一个OCSP响应签名属性。

我知道如何使用更改签名本身

org.bouncycastle.cms.CMSSignedData.replaceSigners(...).getEncoded()

但我不知道如何更换PdfName.CONTENTS使用PDF中的new PdfString(newSignature).setHexWriting(true) 。 如果我用这个代码:

PdfDictionary other = new PdfDictionary();
other.put(PdfName.CONTENTS, new PdfString(newSignature).setHexWriting(true));
dicSignature.merge(other);

其中dicSignature是包含签名的词典,那么签名(当文件在Adobe Reader中打开)坏了。

Answer 1:

当iText的操纵使用的文档PdfStamper在正常模式下,它可以(而且经常)重新安排现有的PDF对象。 这显然打破了现有的集成签名的哈希值。 而且这将有字节范围要签名,变化。 这最有可能是你的问题。

当iText的操纵使用的文档PdfStamper追加模式,它离开PDF的是,只有附加了补充和修改。 虽然这一般是去保持综合签名破裂的方式,你不能改变一个签名的内容这种方式,因为有关于嵌入签名比一般的PDF文件更严格的规则。 切换到附加模式,因此,也不会解决您的问题。

因此,iText的有一个明确的方法做了签名插入,而不用改变PDF:

MakeSignature.signDeferred(PdfReader reader,
    String fieldName,
    OutputStream outs,
    ExternalSignatureContainer externalSignatureContainer)
throws DocumentException, IOException, GeneralSecurityException

它的名字是由于这样的事实,这种方法最初是用于延期签约的使用情况下,即首先准备PDF的签名(即增加所有词典和散列字节范围所需的其他必要的结构,包括留下缺口成签名容器最终将被注入),计算哈希值,并将其发送给其他一些服务,而本地存储的准备PDF。 一旦该其他服务返回签名,将制备的PDF位于与所检索的签名是使用该方法插入到它。

您使用情况下,唯一的区别是,已经存在的差距签名。 该签名,虽然会被你改写使用时更新一个signDeferred

说了这么多,你都会感到惊讶,如果你希望你添加一个OCSP响应签名属性,则 Adobe Reader使用这些信息进行验证是英寸 在根据集成PDF签名上下文ISO-32000-1 , 如在ISO 32000使用部分12.8.3.3 PKCS#7签名

在PKCS#7对象应包含[...]撤销信息作为签名的属性 (PDF 1.6):这个属性可以包括所有必要进行吊销检查签名者的证书和发行者证书的吊销信息。 由于吊销信息签署的属性, 它必须在数字签名的计算之前获得。 这意味着,由签名者所使用的软件必须能够构建证书路径和相关的撤销信息。 如果不能获得所述元件中的一个(例如,没有连接是可能的),与此属性的签名将是不可能的。



文章来源: Replace signature content in a PDF
标签: java pdf itext