数字签名的PDF由ItextSharp 5.5.12正确验证,但不是由Adobe Reader DC验证

时间:2017-10-05 17:40:45

标签: itext

此链接(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;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

问题在于PDF本身已损坏。

PDF有两个版本,

  • 显然是使用&#34; Marvell Semiconductor,Inc。创建的第一个修订版 - http://www.marvell.com&#34; (根据制作人信息词典条目)
  • 对包含使用iTextSharp 5.4.3显然创建的签名的第二个修订的增量更新。

第一个版本在很多方面被打破,两个明显的错误是:

  • 标头无效;根据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打开此文件时,它可能还会识别错误,但它只是创建了内部交叉引用表,除了交叉引用查找之外,它仍可用于原始文件。因此,哈希是正确的,并且所有内容都位于它所属的位置,从而导致验证成功。