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

Pdf multiple signatures validation and AcroFields.SignatureCoversWholeDocument method

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) returns false,第二个 - true。 Pdf 由 this 示例中的方法签名(参见 SignTest 方法)。当我们第二次签名时,额外的第 4 个参数 "append" 被传递给此调用:PdfStamper.CreateSignature(reader, os, '[=12=]', true);

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

第一次签名时,第一个签名覆盖整个文档。到目前为止一切顺利。

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

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

看看这张图片:

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

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