我有一个已经过数字签名的pdf,我想检查一下:
1)pdf包含签名
2)如果签名有效
我已经使用iTextSharp库尝试了一些代码,但没有成功。放置我尝试过的解决方案之一,但没有成功。特别是当我检查names.Count时,它会成功并立即返回false。我附加了一个屏幕来阅读AcroFields,我不知道它是否有助于理解这个问题。我无法摆脱它。
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包。任何解决方案或建议都是受欢迎的。谢谢
在您的问题标题中,您要求一种方法来验证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上查看项目,以了解完整的签名和签名验证服务。
如果所需的验证配置文件不同,请澄清。