尝试 getSignatureDictionaries 时 PDFBox 不工作

Posted

技术标签:

【中文标题】尝试 getSignatureDictionaries 时 PDFBox 不工作【英文标题】:PDFBox not working when try getSignatureDictionaries 【发布时间】: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 版本? 另外,请澄清您所说的“非常慢”是什么意思。秒?分钟?几小时? 【参考方案1】:

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

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

【讨论】:

以上是关于尝试 getSignatureDictionaries 时 PDFBox 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 尝试排队作业,触发新尝试的正确方法?

尝试在java中的socket客户端程序中捕获多次尝试

如何在 PHP 中限制用户登录尝试

如何处理 Swift 的“尝试”?导致“尝试的结果?未使用”? [复制]

我正在尝试从 pyspark 访问 mysql 表。我正在尝试使用:

尝试从 python 数据帧创建多级标头-尝试 Multiindex.from_product() [重复]