Pdf多重签名验证和AcroFields.SignatureCoversWholeDocument方法

时间:2015-09-04 08:23:43

标签: c# pdf itextsharp digital-signature

pdf签名验证代码:

    public bool ValidateFileSignatures(Stream stream)
    {
        stream.Seek(0, SeekOrigin.Begin);
        PdfReader reader = new PdfReader(stream);

        AcroFields af = reader.AcroFields;
        var names = af.GetSignatureNames();
        if (names.Count == 0)
            return false; // no signatures

        foreach (string name in names)
        {
            if (!af.SignatureCoversWholeDocument(name))
            {
                return false;
            }

            PdfPKCS7 pk = af.VerifySignature(name);

            X509Certificate[] pkc = pk.Certificates;

            if (!pk.Verify())
            {
                return false;
            }
        }

        return true;
    }

在第一次签署文件的时候,一切顺利。但是如果文档签名两次,则有2个字段具有签名,并且对于第一个方法af.SignatureCoversWholeDocument(name)返回false,第二个为true。 Pdf由this示例中的方法签名(请参阅SignTest方法)。当我们第二次签名时,额外的第4个参数“append”被传递给此次调用:PdfStamper.CreateSignature(reader, os, '\0', true);

如何使SignatureCoversWholeDocument方法适用于所有签名?或者这是不可能的,我需要删除多个签名文件的检查?

1 个答案:

答案 0 :(得分:2)

第一次签名时,第一个签名涵盖整个文档。到目前为止一切都很好。

第二次签名时,第一个签名不再涵盖整个文档。这应该很容易理解:第一个签名不包括添加到文档中的第二个签名,因此第一个签名不包括整个文档。只有第二个签名涵盖了整个文档。

您正在解释一个不是问题的问题,只是您的误解。

看一下这张图片:

enter image description here

第一个签名包括修订版1,但不包括整个文档。 第二个签名包括修订版2.这包括修订版1,但不包括整个文档。第三个签名包括修订版3,包括修订版1和2.它还涵盖整个文档。

这就是数字签名在PDF中的工作方式。如果您需要更多信息,请阅读ISO-32000-1或PAdES标准。