簡體   English   中英

如何驗證pdf文件包含有效的數字簽名?

[英]How to verify that a pdf file contains a valid digital signature?

我有一個已經過數字簽名的pdf文件,我想檢查一下:

1)pdf包含簽名

2)如果簽名有效

我已經使用iTextSharp庫嘗試了一些代碼,但是沒有成功。 放置我嘗試過的解決方案之一,但沒有成功。 特別是當我檢查names.Count時,它會成功並立即返回false。 我正在附加一個屏幕來閱讀AcroField,我不知道它是否可以幫助您理解問題。 我不能擺脫它。

在此處輸入圖片說明 在此處輸入圖片說明

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包。 歡迎任何解決方案或建議。 謝謝

在問題標題中,您要求一種方法來驗證pdf文件包含有效的數字簽名

不過,您提供的示例文件不是 包含數字簽名pdf文件 反過來說,它是一個簽名容器,其中包含PDF作為其嵌入式簽名數據

因此,iText通過af.GetSignatureNames().Count == 0告訴您PDF不包含任何簽名是因為它實際上不包含簽名,這並不奇怪。

要檢查是否具有這樣的PDF簽名,您不需要像iText這樣的PDF庫,而是需要一種其他類型的庫/ API,該庫可以檢查內容並驗證CMS簽名容器的簽名,例如BouncyCastle首先進行簡單驗證或eSignature DSS,以進行歐盟合格的簽名驗證。


有關帶有嵌入式簽名的PDF的背景,請參見此答案


考慮您的示例簽名,您可能會對根據歐洲合格簽名立法進行驗證感興趣。

CEF數字簽名服務是為此提供的一個公開的驗證器實現。 有一個演示Web應用程序可用於驗證是否使用此軟件。

DSS用Java編寫,但是您可以將其作為通過REST與之通信的服務來運行。 這也應該允許與.Net代碼輕松集成。

如果您願意這樣做,只需使用演示Web應用程序來驗證您的測試用例,並檢查結果是否符合您的期望。 例如,您的示例文件已驗證為TOTAL_PASSED。 (在我看來,使用SHA1withRSA / 2048對簽名者證書的OCSP響應進行簽名有點關鍵。)

如果那不是您的選擇,您仍然可以在github上簽出項目,以獲得全面的簽名和簽名驗證服務的想法。

如果所需的驗證配置文件不同,請進行說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM