Itext 7.2.2添加二次签名后首个签名失效问题排查求助
问题分析与解决思路
可能的操作错误点
未确保两次签名均使用追加模式
追加模式(useAppendMode())是iText保留原有签名有效性的核心,必须保证第一次签名时就启用该模式。如果第一次签名用了默认的覆盖模式,文档原有内容会被替换,后续再追加签名时,第一次签名的基础已被破坏,必然失效。CMS预留空间设置不合理
代码中signBoxData.getCmsSize()指定了签名容器的预留大小,如果这个值过小,iText在生成签名时可能无法在追加的修订中完成写入,转而修改原有文档内容,导致第一个签名的哈希验证失败。建议设置合理的预留值(比如2048或4096字节),或者直接省略该参数让iText自动计算。签名读取流处理错误
第二次签名时,必须读取第一次签名完成后的完整PDF流,而非原始未签名的PDF流。如果pdfStream传入的是初始PDF,相当于重新签名原始文档,自然会覆盖第一次签名。Subfilter兼容性问题
两次签名使用的subfilter需符合PDF规范,比如统一使用PdfName.Adbe_pkcs7_detached。混用不兼容的子过滤器可能导致签名验证逻辑出错。
关于Producer标签的"modified"标识
这个标识是iText在修改文档(包括追加签名)时自动添加的,仅用于标注文档被编辑过,不会直接导致签名失效。签名有效性取决于签名覆盖的文档内容是否被篡改,只要是通过追加模式添加新签名,原有签名覆盖的内容未被修改,就应该能通过验证。
修正后的示例代码
// 第一次签名(必须启用追加模式) PdfSigner firstSigner = new PdfSigner(new PdfReader(originalPdfStream), firstSignedPdfStream, new StampingProperties().useAppendMode()); IExternalDigest digest = new BouncyCastleDigest(); IExternalSignature signature = new PrivateKeySignature(firstPk, digestAlgorithm, provider); firstSigner.signDetached(digest, signature, firstChain, null, null, null, 4096, PdfName.Adbe_pkcs7_detached); // 第二次签名,读取第一次签名后的PDF流 PdfSigner secondSigner = new PdfSigner(new PdfReader(firstSignedPdfStream), finalPdfStream, new StampingProperties().useAppendMode()); IExternalSignature secondSignature = new PrivateKeySignature(secondPk, digestAlgorithm, provider); secondSigner.signDetached(digest, secondSignature, secondChain, null, null, null, 4096, PdfName.Adbe_pkcs7_detached);
内容的提问来源于stack exchange,提问作者Cemail Sn
相关产品推荐
相关产品推荐

