使用@ninja-labs/verify-pdf验证PDF签名Adobe显示有效却返回false如何解决
问题解决方案
针对@ninja-labs/verify-pdf的适配方案
- 升级到库的最新正式版本,该库历史版本存在较多PAdES标准签名、多签名场景的解析bug,新版修复了大量字段返回异常的问题。
- 手动传入信任根证书列表:Adobe Reader内置了全球信任的CA根证书库,但是该库默认没有集成根证书,需要将你待验证PDF签名对应的根证书、中间证书导出为PEM格式,作为第二个参数传入verifyPDF方法,示例修改如下:
var fs = require('fs'); const verifyPDF = require('@ninja-labs/verify-pdf'); var d='C://Users//xxxxxx//Downloads//Testss.pdf'; const signedPdfBuffer = fs.readFileSync(d); // 新增:加载信任的根证书/中间证书,可从Adobe Reader中导出对应签名的证书链 const trustedCerts = [ fs.readFileSync('./rootCA.pem'), fs.readFileSync('./intermediateCA.pem') ]; const { verified, authenticity, integrity, expired, meta } = verifyPDF(signedPdfBuffer, trustedCerts); // 其余打印逻辑保持不变
- 检查PDF签名属性:该库不支持签名后存在增量修改的PDF、多数字签名场景、PAdES B-LT/B-LTA级别长期存档签名,若你的PDF属于以上场景,该库无法正常解析。
替代实现方案
- 基于node-forge自主实现验证逻辑:@ninja-labs/verify-pdf底层依赖node-forge解析签名,你可以直接用pdf-lib提取PDF中的签名字段、签名原文哈希、证书链数据,自主完成哈希完整性校验、证书链信任校验,灵活性更高可适配各类签名格式。
- 调用系统pdfsig命令行工具:poppler工具包自带的pdfsig工具对PDF签名标准的支持度极高,验证结果和Adobe Reader一致性极强,使用该方案需要先在运行环境中安装poppler工具包(Windows、Linux、macOS均有官方安装包),之后通过child_process调用该工具后解析输出结果即可,示例逻辑如下:
const { exec } = require('child_process'); const pdfPath = 'C://Users//xxxxxx//Downloads//Testss.pdf'; exec(`pdfsig "${pdfPath}"`, (err, stdout, stderr) => { if (err) { console.error('调用验证工具失败', err); return; } // 解析stdout中的验证结果,包含签名有效性、证书是否信任、完整性是否通过、是否过期等字段 console.log(stdout); });
内容的提问来源于stack exchange,提问作者Dominator
相关产品推荐
相关产品推荐

