我有一个经过数字签名的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 here
我还找到了另一个使用Pknet库的解决方案,但找不到NuGet软件包。欢迎任何解决方案或建议。谢谢
答案 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上签出项目,以获得全面的签名和签名验证服务的想法。
如果所需的验证配置文件不同,请进行说明。