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

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

1)pdf包含签名

2)如果签名有效

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

http://img4.mukewang.com/6370a1130001039c19221075.jpg

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 可在此处找到


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



小怪兽爱吃肉
浏览 233回答 1
1回答

潇潇雨雨

在问题的标题中,您要求提供一种方法来验证 pdf 文件是否包含有效的数字签名。但是,您提供的示例文件不是包含数字签名的pdf 文件;相反,它是一个包含 PDF 作为其嵌入式签名数据的签名容器!因此,iText 告诉您(通过af.GetSignatureNames().Count == 0)PDF 不包含任何签名也就不足为奇了,因为它确实不包含。要检查您是否有这样签名的 PDF,您不需要像 iText 这样的 PDF 库,而是需要不同类型的库/API,一个可以检查内容并验证 CMS 签名容器的签名的库,例如 BouncyCastle 用于用于欧盟合格签名验证的第一个简单验证或电子签名 DSS。有关嵌入签名的 PDF 的背景,请参阅此答案。考虑到您的示例签名,您可能对根据欧洲合格签名法规进行验证感兴趣。一种公开可用的验证器实现是CEF 数字签名服务。有一个用于验证使用此软件的演示 Web 应用程序。DSS 是用 Java 编写的,但您可以将其作为通过 REST 与之通信的服务运行。这也应该允许与 .Net 代码轻松集成。如果这对您来说是一个选项,只需使用演示 Web 应用程序来验证您的测试用例并检查结果是否符合您的期望。例如,您的示例文件被验证为 TOTAL_PASSED。(在我看来,使用 SHA1withRSA/2048 对签名者证书的 OCSP 响应进行签名有点关键。)如果这不是您的选择,您仍然可以在github上查看该项目,以了解完整的签名和签名验证服务。如果所需的验证配置文件不同,请澄清。
打开App,查看更多内容
随时随地看视频慕课网APP