我使用Adobe 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)
中的示例代码
我使用了一般PDF,密码受Adobe Acrobat保护,然后从Adobe Acrobat自签名。
答案 0 :(得分:0)
iText 5安全API确实无法验证加密文档的签名。
原因是解密代码不足:就像大多数其他字符串一样,它也“解密”签名词典的内容键的值。但是,由于这些“加密”并未加密,因此这种“解密”实际上会扰乱它们。因此,PdfPKCS7
类不能将它们解析为签名容器并抛出观察到的异常。
与此相反,iText 7安全API可以验证此类签名。
与上面解释的iText 5情况不同,这里对PDF字符串的解密推迟到实际使用它们的内容。签名API在访问内容之前,将内容 PDF字符串标记为未加密。因此,可以按原样访问它们的原始值。
(这有点冒险,因为有些代码可能会事先检索这些字符串的内容,从而导致“解密”。另一方面,这就无需在PdfReader
中解析PDF AcroForm信息;一般的表单解析和特别是签名解析不是内核模块的一部分,这样的必要性会导致代码重复或多个模块的合并。)