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;
}当我们第一次签署文件时,一切都很好。但是,如果文档签名了两次,就会有两个带有签名的字段,对于第一个字段,方法af.SignatureCoversWholeDocument(name)返回false,第二个为true。Pdf由这示例中的方法签名(参见SignTest方法)。当我们第二次签名时,附加的第4个参数"append“被传递给这个调用:PdfStamper.CreateSignature(reader, os, '\0', true);。
如何使SignatureCoversWholeDocument方法对所有签名都有效?或者这是不可能的,我需要删除这张多个签名文件的支票?
发布于 2015-09-04 08:37:25
当您第一次签名时,第一个签名涵盖了整个文档。到目前一切尚好。
当您第二次签名时,第一个签名不再涵盖整个文档。这应该很容易理解:第一个签名不包括添加到文档中的第二个签名,因此第一个签名并不包括整个文档。只有第二个签名涵盖整个文件。
你是在解释一个不是问题的问题,只是你自己的误解。
看一看这张图片:

第一个签名涵盖第1版,但不包括整个文档。第二个签名包括第2版,包括第1版,但不包括整个文件。第三份签名涵盖第三版,包括第一版和第二版,还包括整个文件。
这就是数字签名在PDF中的工作方式。如果您需要更多信息,请阅读ISO-32000-1或PAdES标准.
https://stackoverflow.com/questions/32393404
复制相似问题