如何验证pdf文件是否包含有效的数字签名?

问题描述 投票:0回答:1

我有一个已经过数字签名的pdf,我想检查一下:

1)pdf包含签名

2)如果签名有效

我已经使用iTextSharp库尝试了一些代码,但没有成功。放置我尝试过的解决方案之一,但没有成功。特别是当我检查names.Count时,它会成功并立即返回false。我附加了一个屏幕来阅读AcroFields,我不知道它是否有助于理解这个问题。我无法摆脱它。

enter image description here enter image description here

public static bool ValidateFileSignatures(byte[] file)
{

    PdfReader reader = new PdfReader(file);

    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);


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

    return true;
}

样本PDF可以找到here

我还发现了另一个使用Pknet库的解决方案,但我找不到NuGet包。任何解决方案或建议都是受欢迎的。谢谢

c# itext
1个回答
1
投票

在您的问题标题中,您要求一种方法来验证pdf文件是否包含有效的数字签名。

但是,您提供的示例文件不是包含数字签名的pdf文件;反过来说,它是一个包含PDF作为嵌入式签名数据的签名容器!

因此,iText告诉您(通过af.GetSignatureNames().Count == 0)PDF不包含任何签名也不足为奇,因为它实际上没有。

要检查您是否有像这样签名的PDF,您不需要像iText这样的PDF库,而是需要一种不同类型的库/ API,一个可以检查内容并验证CMS签名容器签名的库,例如: BouncyCastle用于第一个简单验证或eSignature DSS,用于欧盟合格的签名验证。


有关嵌入签名的PDF背景,请参阅this answer


考虑到您的示例签名,您可能会对根据欧洲合格签名法规进行验证感兴趣。

一个公开可用的验证器实现是CEF Digital Signature Services。有一个demo web application用于验证使用此软件。

DSS是用Java编写的,但您可以将其作为通过REST与之通信的服务运行。这应该允许与.Net代码轻松集成。

如果这是您的选择,只需使用演示Web应用程序验证您的测试用例并检查结果是否符合您的期望。例如。您的示例文件验证为TOTAL_PASSED。 (在我看来,使用SHA1withRSA / 2048签署签名者证书的OCSP响应有点关键。)

如果这不适合您,您仍然可以在github上查看项目,以了解完整的签名和签名验证服务。

如果所需的验证配置文件不同,请澄清。

© www.soinside.com 2019 - 2024. All rights reserved.