iText检测LTV签名未覆盖全文档 如何排除末尾DSS字节?
为什么检测返回FALSE
iText 7.1.7版本SignatureUtil.signatureCoversWholeDocument方法的设计逻辑是校验签名的ByteRange是否覆盖当前PDF文件的所有字节,而你的场景中DSS字典是签名完成后增量追加到文档末尾的内容:
- 根据PDF 2.0以及LTV相关规范,DSS属于签名后的增量补充信息,本身不会被纳入签名时的字节覆盖范围
- 该版本方法没有做兼容LTV场景的特殊处理,不会识别末尾追加的DSS是合法增量,所以直接返回FALSE,符合方法本身的原始设计逻辑。
怎么忽略末尾DSS字节的影响
你不需要修改原生方法的调用逻辑,只需要在原生方法返回FALSE时,追加DSS合法性校验即可,步骤如下:
- 调用
signatureUtil.getSignatureByteRange()获取签名的字节范围数组,取数组最后一位得到签名覆盖的最大字节位置sigEndOffset - 读取当前PDF的全量字节,从
sigEndOffset位置开始向后扫描,校验后续内容是否仅包含合规的LTV DSS增量:- 仅包含DSS字典、对应的增量交叉引用表、新版本文档目录、新的EOF标记
- 没有修改签名前已存在的任何PDF对象,没有新增页面、注释、表单字段等非DSS相关内容
- 若上述校验通过,即可认为该签名符合业务上的「全文档覆盖」要求,无需受原生方法返回结果限制。
如果不想自己实现校验逻辑,也可以直接升级iText到7.2及以上版本,该版本开始已经原生支持识别合法的LTV DSS增量,signatureCoversWholeDocument方法对于仅追加了合规DSS的签名文档会直接返回TRUE。
内容的提问来源于stack exchange,提问作者Radek Kantor
相关产品推荐
相关产品推荐

