当前位置: 首页 > 面试题库 >

替换PDF中的签名内容

乐正涵忍
2023-03-14
问题内容

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

我知道如何使用

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

但我不知道如何使用替换PdfName.CONTENTSPDF new PdfString(newSignature).setHexWriting(true)。如果我使用此代码:

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

dicSignature包含签名的字典在哪里,则签名(在Adobe Reader中打开文档时)被破坏。


问题答案:

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

当iText使用PdfStamperin追加模式操作文档时,它将保持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使用这些信息进行验证,您可能会感到惊讶。在根据ISO-32000-1(
在ISO 32000中使用的 12.8.3.3 PKCS#7签名) 的集成PDF签名的情况下,

daccess-ods.un.org daccess-ods.un.org PKCS#7对象应包含作为 签名属性的 撤消信息(PDF
1.6):此属性可能包括执行对签名者证书及其发行者证书进行撤消检查所需的所有撤消信息。由于吊销信息是已签名的属性,
因此必须在计算数字签名之前获取它。
这意味着签名者使用的软件必须能够构造证明路径和相关的吊销信息。如果无法获得其中一个元素(例如,无法建立连接),则无法使用具有此属性的签名。



 类似资料:
  • 我想知道是否有一个替代包括完整的CRL同时仍然支持LTV?包含完整的CRL似乎有点矫枉过正,而似乎唯一需要的“东西”是包含一个可验证的证明,证明链中的证书在签名时没有被撤销。我认为使用OCSP可能会提供这样的功能,但是简单地删除CRL并包含一个OcspClientBouncyCastle实例并不能起到作用。授予SignDetached的OCSP是否用于检查证书是否在签名时被吊销? 一个相关的问题涉

  • 我关注以下帖子:iTextSharp-如何获取PDF内容进行签名,然后在以后进行签名,作为从PDF文档获取数据的基础,创建一个带有空白签名的临时文件,然后返回该临时文件的哈希值。散列被发送到在本地拥有令牌的客户端,在那里对其进行签名,并返回到签名的web应用程序。此时,我将其转换为字节并生成最终的签名文档。 但是,签名的文档没有有效的签名,显示消息:Error in decoding BER。 1

  • 我正在尝试通过签名服务签署一个pdf文件。这个服务需要发送一个十六进制编码的SHA256摘要,作为回报,我会收到一个十六进制编码的SignatureValue。此外,我还收到了签名证书、中间证书、OCSP响应和TimeStampToken。但是,我在尝试使用SignatureValue对pdf进行签名时已经陷入了困境。 我读过布鲁诺的白皮书,过度浏览互联网,尝试了很多不同的方式,但签名不断出现无效

  • 我正在将一些PDF编辑工具从iTextSharp更新到iText7。 在iTextSharp中,pdfStamper类中有一个方法:pdfStamper。ReplacePage()。然而,iText7中的pdfStamper类已被删除,我在复制相同的功能时遇到困难。 假设我有文档X,需要用文档Y的第1页替换第4页,但我希望结果保存到一个新的文档Z。 到目前为止,我有3行使用CopyPageTo方法

  • 我对iTextSharp有意见。我有一个带有表单字段的文档,并且我已经为签名生成了字段。当第一个人在文件上签字时,它就会正常工作。Adobe Reader显示有效签名。当我让第二个人在文档上签名时,Adobe Reader显示签名1现在是“未知签名”,签名无效。Adobe reader显示: 此签名中包含的格式或信息有错误(支持信息:SigDict/Contents非法数据)

  • 我正在处理一个CMS,它将文本块格式化如下: