当前位置: 首页 > 知识库问答 >
问题:

PDF/A-3A文档的PAdES LTV签名产生无效签名

郎宣
2023-03-14

我有一个问题与数字签名PDF文件已标记为PDF/A-3A兼容。使用PDFBox(最新版本,2.0.24)最终在Adobe Acrobat中获得无效签名,而使用iText7(最新版本)获得有效签名。目标是获得符合PAdES LTV的签名。

我的流程如下(使用PDFBox和iText7):

  • 打开PDF,创建用于签名的散列(要签名的数据)
  • 我呼叫第三方服务以取回数字签名
  • 在服务响应中,我还获得了OCSP和CRL内容,我需要嵌入到PDF中以提高LTV质量
  • 我将签名嵌入到PDF中
  • 我将文档保存到内存中,然后重新打开它以嵌入OCSP和CRL
  • 嵌入OCSP和CRL项,创建各自的DSS和VRI词典
  • 我将PDF保存到磁盘

我还注意到只要做:

document.load(inputStream);
document.save(outputStream);

我破坏了签名。从我的测试来看,实际的嵌入并不是问题的真正原因,而只是我在嵌入签名后重新打开PDF并将其保存回磁盘。

使用相同的过程(密钥、证书等),我最终在Adobe Acrobat中通过iText7获得一个有效的LTV签名。

PDDocumentInformation info = pdDocument.getDocumentInformation();
if (info != null && StringUtils.containsIgnoreCase(info.getProducer(), "Aspose")) {
try {
    pdDocument.save(inMemoryStream);
    pdDocument.close();
    pdDocument = PDDocument.load(inMemoryStream.toByteArray());
    inMemoryStream.reset();
} catch (Exception e) {

谢谢@MKL和@TilmanHausher,你是对的。假设使用某个库生成的所有文档都必须自动规范化,这不是一个好主意,因为现有的签名将会失效。最后,更好的想法是保持代码原样,并期待一个正确构造的PDF。在创建的地方修复问题。

共有1个答案

寿和通
2023-03-14

问题是由原始PDF中的错误引起的。您的PDFBox代码在追加模式下签名(即在增量更新中),因此在签名版本中也存在错误。您的iText代码不在追加模式下登录,而是重写整个PDF;在这样做的时候,它不会犯与您的原始PDF生产者相同的错误,所以该错误不再出现在签名版本中。Adobe Acrobat在验证带有更新的签名时对此类问题非常敏感。

PDF中初始修订版的对照表不能分成单独的小节,但如果是原始PDF,它已经被拆分:

0 75
0000000000 65535 f
0000000018 00000 n
...
0000313374 00000 n
0000313397 00000 n
76 20
0000313419 00000 n
0000313443 00000 n
...
0000846048 00000 n
0000846175 00000 n

类似的情况已经在这个答案,这个答案,这个答案,和其他地方讨论过;您还可以在这些答案中找到一些规范参考。

 类似资料:
  • 我在PDF文档中(以编程方式)填写一个表单(AcroPdf),然后在文档上签名。我从doc.pdf开始,使用pdfbox的setfields.java示例创建doc_filler.pdf。然后我对doc_fill.pdf进行签名,创建doc?filled_signer.pdf,使用一些代码,基于签名示例并在Acrobat Reader中打开pdf。输入的字段数据是可见的,并且签名面板告诉我 “此签

  • 然而,我想使用相同的文件,这意味着我不再假装复制PDF了。我要抓取文档,签名,并覆盖原来的。 由于我了解到让FileInputStream和FileOutputStream指向同一个文件不是一个好主意,所以我只是尝试使用file类。 我尝试了以下操作:

  • 问题内容: 我在PDF文档中(以编程方式)填写了表格(AcroPdf),然后在文档上签名。我从doc.pdf开始,使用PDFBox的setFields.java示例创建doc_filled.pdf。然后,我根据签名示例使用一些代码对doc_filled.pdf进行签名,以创建doc?filled_signed.pdf,然后在Acrobat Reader中打开pdf。输入的字段数据可见,签名面板告诉

  • 所以我最近一直在处理PDF文档的签名,今天我遇到了一个新的奇妙的问题。因此,当我签署文档(文档实际上是在服务器上签署的)并在我的机器中打开文档时,签名显示有效,并且启用了LTV,因此几乎与预期的工作方式相同。但是,当我在老板的计算机上打开相同的文档时,它显示即使在证书被信任后也无法验证签名的身份,但如果我打开证书属性,它会说证书是有效的,吊销已经成功执行。这可能是什么原因? 图1:证书本身是可信的

  • 目标是实现一个PDF签名过程,其中服务器根据请求向客户端提供要签名的哈希。然后,客户端使用通过PKCS#11接口从智能卡获得的私钥对给定哈希进行签名。然后,签名被发送回服务器,以便使用iTextSharp 5.5.4附加到PDF文件中。 在Acrobat Reader中查看签名时,我发现错误“自签名应用以来,文档已被更改或损坏”。 下面是我在服务器上计算哈希的方法。 客户端对给定的哈希签名后,我将

  • 使用iText7,我试图对PDF进行签名,以获得外部实体的签名。该过程必须按如下方式执行 使用Web服务并获得证书, 获取要签名的PDF哈希。哈希在发送到外部实体进行签名之前必须有前缀。 我为此创建了一个临时PDF。 在信息交换中使用网络服务。 发送哈希; 通过短信获取确认; 获取签名的哈希。 使用签名的哈希,我签署最终的PDF。 问题是,我发现一个错误,即在应用签名后,文档已被更改或损坏<项目实