gpt4 book ai didi

java - 替换 PDF 中的签名内容

转载 作者:行者123 更新时间:2023-11-30 04:30:07 24 4
gpt4 key购买 nike

如何在 iText 中完成此操作?我有一份带有客户签名的 PDF 文件。我需要向未签名的属性添加 ocsp 响应。

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

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

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

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

其中 dicSignature 是包含签名的字典,那么签名(当在 Adob​​e Reader 中打开文档时)就会被破坏。

最佳答案

当 iText 在正常模式下使用PdfStamper操作文档时,它可以(而且经常)重新排列现有的 PDF 对象。这显然破坏了任何现有集成签名的哈希值。此外,必须签名的字节范围也会发生变化。这很可能是您的问题。

当 iText 在追加模式下使用 PdfStamper 操作文档时,它会按原样保留 PDF,仅追加其添加和更改。虽然这通常是防止集成签名被破坏的方法,但您不能以这种方式更改签名的内容,因为有关嵌入签名的规则比一般 PDF 更严格。因此,切换到追加模式并不能解决您的问题。

因此,iText 有一个显式方法来插入签名,而无需更改 PDF:

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

它的名字是因为这个方法最初是用于延迟签名的用例,即首先准备 PDF 进行签名(即添加散列字节范围所需的所有字典和其他必要的结构,包括留下一个签名容器最终将被注入(inject)的间隙),计算哈希值,并将其发送到其他服务,同时在本地存储准备好的 PDF。一旦其他服务返回签名,就会找到准备好的 PDF,并使用此方法将检索到的签名插入其中。

与您的用例的唯一区别是间隙中已经有签名。不过,在使用 signDeferred 时,该签名将被更新后的签名覆盖。

话虽如此,如果您预计在向未签名属性添加 ocsp 响应后,Adobe Reader 使用这些信息进行验证,您可能会感到惊讶。在集成 PDF 签名的上下文中,根据 ISO-32000-1 ,第 12.8.3.3 节 ISO 32000 中使用的 PKCS#7 签名

the PKCS#7 object should contain [...] Revocation information as an signed attribute (PDF 1.6): This attribute may include all the revocation information that is necessary to carry out revocation checks for the signer's certificate and its issuer certificates. Since revocation information is a signed attribute, it must be obtained before the computation of the digital signature. This means that the software used by the signer must be able to construct the certification path and the associated revocation information. If one of the elements cannot be obtained (e.g. no connection is possible), a signature with this attribute will not be possible.

关于java - 替换 PDF 中的签名内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14831200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com