此链接(Document)包含由IText(版本5.5.12)正确验证的经过数字签名的PDF,但不会由发出以下消息的Adobe Reader DC验证:
签名验证期间出错。
定义签名数据范围的意外字节范围值。 详细信息:签名字节范围无效
谁是对的? Adobe DC或IText? IText Bug?
用于PDF数字签名验证的示例ITextSharp代码:
using System;
using System.Collections.Generic;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
namespace ClassLibrary1
{
public class Class1
{
public Boolean PDFVerify(String file)
{
PdfReader pdfr = new PdfReader(file);
AcroFields af = pdfr.AcroFields;
List<String> names = af.GetSignatureNames();
foreach (String name in names)
{
PdfPKCS7 pk = af.VerifySignature(name);
if (!pk.Verify()) return false;
}
return true;
}
}
}
答案 0 :(得分:0)
问题在于PDF本身已损坏。
PDF有两个版本,
第一个版本在很多方面被打破,两个明显的错误是:
标头无效;根据ISO 32000-1 ,PDF文件的第一行应为由5个字符%PDF组成的标题,后跟1.N形式的版本号,其中N是0到7之间的数字。 这里的标题行是
%PDF-1.4 Marvell Semiconductor
以上引用的规则不允许超过%PDF-1.N
。
无效的交叉引用表条目;根据ISO 32000-1 ,每个条目的长度应为20个字节,包括行尾标记。此处每个条目只有19个字节长,包括行尾标记。< / p>
可能会有更明显的问题。
第二次修订的增量更新中没有明显的错误。
当Adobe Reader打开此文件时,它会识别它已损坏,在内部创建修复版本,从现在开始使用此修复版本。签名验证后,将在此修复版本中进行验证。但是,这样的修复显然会改变PDF的散列,并且很可能会改变签名的位置。签名字节范围应该是整个文件,包括签名字典,但不包括签名值本身。如果修复移动了嵌入式签名,则不再满足此要求,导致观察到的错误消息。
当iText打开此文件时,它可能还会识别错误,但它只是创建了内部交叉引用表,除了交叉引用查找之外,它仍可用于原始文件。因此,哈希是正确的,并且所有内容都位于它所属的位置,从而导致验证成功。