You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Apache PDFBox验证签名证书是否在AATL/EUTL注册

用Apache PDFBox验证签名证书是否在AATL/EUTL中

核心说明

Apache PDFBox没有内置AATL/EUTL的信任列表——这两个列表分别由Adobe和欧盟定期维护更新,需要你自行获取并加载对应的信任锚证书集合,再基于此做验证。

实现步骤

1. 获取信任列表证书

  • AATL:从Adobe官方渠道下载最新的AATL信任锚证书包
  • EUTL:从欧盟官方渠道获取最新的EUTL信任锚证书集合

2. 代码实现验证逻辑

通过加载信任锚到密钥库,再用PDFBox的签名验证器检查证书链是否能追溯到AATL/EUTL中的信任锚,示例代码如下:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureValidator;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.ValidationResult;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.List;

public class AatlEutlChecker {
    public static void main(String[] args) throws Exception {
        // 注册BouncyCastle(PDFBox签名验证必备依赖)
        Security.addProvider(new BouncyCastleProvider());

        // 初始化信任库,加载AATL/EUTL信任锚
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);
        
        // 替换为你的AATL证书目录路径,遍历导入所有信任锚
        File aatlCertDir = new File("path/to/your/aatl/certs");
        for (File certFile : aatlCertDir.listFiles(f -> f.getName().endsWith(".cer"))) {
            Certificate cert = CertificateFactory.getInstance("X.509")
                    .generateCertificate(new FileInputStream(certFile));
            trustStore.setCertificateEntry(certFile.getName(), cert);
        }

        // 加载待验证的PDF文档
        try (PDDocument document = PDDocument.load(new File("signed_ltv.pdf"))) {
            List<PDSignature> signatures = document.getSignatureDictionaries();
            
            for (PDSignature signature : signatures) {
                SignatureValidator validator = new SignatureValidator(document, signature);
                validator.setTrustStore(trustStore);
                
                // 执行验证
                ValidationResult result = validator.validateSignature();
                
                // 验证状态为VALID,说明证书链可追溯到AATL/EUTL信任锚
                boolean isTrusted = result.getStatus() == ValidationResult.ValidationStatus.VALID;
                System.out.printf("签名[%s]是否属于AATL/EUTL信任列表:%b%n", signature.getName(), isTrusted);
            }
        }
    }
}

关于PDFBox生成LTV文档的自动验证

PDFBox在生成LTV签名时,不会自动检查证书是否在AATL/EUTL中。它仅负责嵌入LTV所需的CRL、OCSP响应等数据,保证签名的长期有效性;你在Adobe Acrobat中看到的“信任源来自Adobe认可信任列表”,是Acrobat自身内置了AATL列表并完成验证,和PDFBox的生成逻辑无关。

手动验证的补充方式

除了上述代码逻辑,还可以拆分步骤验证:

  • 从签名中提取证书链:解析signature.getContents()得到的PKCS7数据,取出完整证书链
  • 单独验证证书路径:用CertificateValidator类,将信任锚设置为加载的AATL/EUTL证书,逐个验证证书链的合法性

内容的提问来源于stack exchange,提问作者Tanmay Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:10:11