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

时间:2019-03-26 17:02:18

标签: c# itext

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

1)pdf包含签名

2)签名是否有效

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

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软件包。欢迎任何解决方案或建议。谢谢

1 个答案:

答案 0 :(得分: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上签出项目,以获得全面的签名和签名验证服务的想法。

如果所需的验证配置文件不同,请进行说明。