【问题标题】:Verifying certificate of signed and secured PDF in iText PDF Java在 iText PDF Java 中验证签名和安全 PDF 的证书
【发布时间】:2018-06-25 09:50:18
【问题描述】:

我使用 Adob​​e Acrobat 保护了一个 PDF,然后对其进行了签名,但是当我尝试使用 iText 验证签名时,它给出了一个错误

Exception in thread "main" java.lang.IllegalArgumentException: can't decode PKCS7SignedData object
at com.itextpdf.text.pdf.security.PdfPKCS7.<init>(PdfPKCS7.java:214)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2427)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2373)
at C5_01_SignatureIntegrity.verifySignature(C5_01_SignatureIntegrity.java:19)
at C5_03_CertificateValidation.verifySignature(C5_03_CertificateValidation.java:42)
at C5_01_SignatureIntegrity.verifySignatures(C5_01_SignatureIntegrity.java:32)
at C5_03_CertificateValidation.main(C5_03_CertificateValidation.java:134)

我正在使用来自https://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-5#887-c5_03_certificatevalidation.java的示例代码

我使用了一个通用的 PDF,密码受 Adob​​e Acrobat 保护,然后从 Adob​​e Acrobat 自行签名。

【问题讨论】:

  • 请分享(链接到)有问题的 PDF。
  • 这里是证书和 PDF 文件的链接,两者都受密码保护 - “密码”(不带引号)。 drive.google.com/drive/folders/…

标签: java pdf encryption itext acrobat


【解决方案1】:

iText 5 安全 API 确实无法验证加密文档的签名。

原因是解密代码的缺陷:就像大多数其他字符串一样,它也“解密”签名字典的 Contents 键的值。但是,由于这些文件一开始并没有加密,这种“解密”实际上是对它们进行了加扰。因此,PdfPKCS7 类无法将它们解析为签名容器并抛出观察到的异常。

与此相反,iText 7 安全 API 可以验证此类签名。

与上面解释的 iText 5 情况不同,此处对 PDF 字符串的解密被推迟到实际使用它们的内容。签名 API 在访问内容之前,将 Contents PDF 字符串标记为未加密。因此,可以按原样访问它们的原始值。

(这有点冒险,因为某些代码可能会事先检索这些字符串的内容,从而导致“解密”。另一方面,这消除了解析 PdfReader 中的 PDF AcroForm 信息的必要性;作为表单解析一般来说,特别是签名解析不是内核模块的一部分,这种必要性要么会导致代码重复,要么会导致多个模块的合并。)

this answer 中更详细地介绍了该问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多