【问题标题】:PDFBox not working when try getSignatureDictionaries尝试 getSignatureDictionaries 时 PDFBox 不工作
【发布时间】:2022-01-17 18:39:32
【问题描述】:

我正在使用 PDFBox 来提取我的 PDF 签名。在 2.0.24 版本中,简单的 PDDocument.load(File file) 得到了一个不寻常的时间。我升级到 3.0.0.-alpha,Loader.loadPDF(File file) 玩得很开心,但是在下一步中,当我尝试提取签名时,我变得非常缓慢,而且永远不会结束。

for (PDSignature sig : document.getSignatureDictionaries()) {
    COSDictionary sigDictionary = sig.getCOSObject();
    COSString contents = (COSString) sigDictionary.getDictionaryObject(COSName.CONTENTS);

    String subFilter = sig.getSubFilter();
    if (subFilter != null) {
        PDFResult pdfResult = new PDFResult();
        pdfResult.setName(sig.getName());
        pdfResult.setContactInfo(sig.getContactInfo());
        pdfResult.setLocation(sig.getLocation());
        pdfResult.setReason(sig.getReason());
        pdfResult.setFilter(sig.getFilter());
        pdfResult.setSignDate(sig.getSignDate().getTime());
        pdfResult.setSubFilter(subFilter);

        switch (subFilter) {
            case "adbe.pkcs7.detached":
            case "ETSI.CAdES.detached":
                verifyPKCS7(getSignedContent(sig, contents), contents, pdfResult);
                break;
            case "adbe.pkcs7.sha1": {
                byte[] hash = MessageDigest.getInstance("SHA1").digest(getSignedContent(sig, contents));
                verifyPKCS7(hash, contents, pdfResult);
                break;
            }
            case "adbe.x509.rsa_sha1":
                COSString certString = (COSString) sigDictionary.getDictionaryObject(COSName.CERT);
                if (certString == null) {
                    throw new IllegalStateException("The /Cert certificate string is missing in the pdfResult dictionary");
                }
                CertificateFactory factory = CertificateFactory.getInstance("X.509");
                ByteArrayInputStream certStream = new ByteArrayInputStream(certString.getBytes());
                Collection<? extends Certificate> certs = factory.generateCertificates(certStream);

                X509Certificate cert = (X509Certificate) certs.iterator().next();

                pdfResult.setCertificate(new br.com.fiorilli.signature.utils.model.Certificate(cert));
                pdfResult.setCertificateEncoded(Base64.getEncoder().encodeToString(cert.getEncoded()));
                break;
            case "ETSI.RFC3161":
                verifyETSIdotRFC3161(contents, pdfResult);
                break;
            default:
                throw new IOException("Unknown certificate type: " + subFilter);
        }
        signatures.add(pdfResult);
    } else {
        throw new IOException("Missing subfilter for cert dictionary");
    }
}

这种情况只发生在特定的 PDF 中,像这样。 Java开始使用高cpu,进程永不结束。

【问题讨论】:

  • 请分享 PDF。我想知道字段树中是否存在循环。
  • 我尝试了 ShowSignature 示例,它工作正常。确保你的类路径是干净的,即只有一个版本。
  • 谢谢。我去看看。
  • 代码测试分配了多少内存?您使用的是哪个 JRE 版本?
  • 另外,请澄清您所说的“非常慢”是什么意思。秒?分钟?几小时?

标签: java pdfbox signature


【解决方案1】:

解决方案是遵循 ShowSignature 示例的所有实现。我的 verifyPKCS7 方法有点不同。对于类似的问题,请按照 github 中的 ShowSignature 示例:

https://github.com/apache/pdfbox/blob/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/ShowSignature.java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 2013-05-30
    • 2016-11-22
    • 2017-03-11
    • 2019-01-29
    • 2019-01-21
    相关资源
    最近更新 更多