如何用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
相关产品推荐
相关产品推荐

