[英]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.