该页面可以包含自动翻译的文本。
在 C# 和 VB.NET 中验证 PDF 签名
PDF 文档中的数字签名可用于检测 PDF 是否被篡改。您可以使用 Docotic.Pdf library 在 PDF 文件中验证数字签名。该库可以帮助您在 .NET Framework 和 .NET Core 应用程序中读取签名属性。请在 下载 C# .NET PDF 库 页面获取该库和免费的限时许可证密钥。

使用 C# 验证 PDF 中的数字签名
Docotic.Pdf 库提供了用于检查文档签名部分在签名后是否被更改的手段。您可以检查签名是否包含嵌入的 OCSP 和/或 CRL 数据。对于任何签名,还可以检查其签名证书在给定日期是否已吊销。
下面的 C# 示例演示如何验证 PDF 签名并检查签名证书的吊销状态:
using BitMiracle.Docotic.Pdf;
using var pdf = new PdfDocument("signed.pdf");
Console.WriteLine("Verification result:");
PdfControl? field = pdf.GetControls().FirstOrDefault(c => c.Type == PdfWidgetType.Signature);
if (field is null)
{
Console.WriteLine("Document does not contain signature fields");
return;
}
PdfSignature? signature = ((PdfSignatureField)field).Signature;
if (signature is null)
{
Console.WriteLine("Signature field does not have an associated signature");
return;
}
PdfSignatureContents contents = signature.Contents;
Console.WriteLine("Signed part is intact: {0}", contents.VerifyDigest());
DateTime signingTime = signature.SigningTime ?? DateTime.MinValue;
Console.WriteLine("Signed on: {0}\n", signingTime.ToShortDateString());
if (contents.CheckHasEmbeddedOcsp())
{
Console.WriteLine("Signature has OCSP embedded.");
CheckRevocation(signature, PdfCertificateRevocationCheckMode.EmbeddedOcsp);
}
if (contents.CheckHasEmbeddedCrl())
{
Console.WriteLine("Signature has CRL embedded.");
CheckRevocation(signature, PdfCertificateRevocationCheckMode.EmbeddedCrl);
}
CheckRevocation(signature, PdfCertificateRevocationCheckMode.OnlineOcsp);
CheckRevocation(signature, PdfCertificateRevocationCheckMode.OnlineCrl);
var timestampToken = contents.GetTimestampToken();
if (timestampToken != null)
{
Console.WriteLine("Signature has timestamp embedded.");
Console.WriteLine("Embedded timestamp: {0}", timestampToken.GenerationTime);
if (timestampToken.TimestampAuthority != null)
Console.WriteLine("Timestamp authority: {0}", timestampToken.TimestampAuthority.Name);
Console.WriteLine("Timestamp is intact: {0}", contents.VerifyTimestamp());
}
private static void CheckRevocation(PdfSignature signature, PdfCertificateRevocationCheckMode mode)
{
PdfSignatureContents contents = signature.Contents;
DateTime signingTime = signature.SigningTime ?? DateTime.MinValue;
foreach (DateTime time in new DateTime[] { signingTime, DateTime.UtcNow })
{
bool revoked = contents.CheckIfRevoked(mode, time);
string status = revoked ? "Revoked" : "Valid";
string date = time.ToShortDateString();
Console.WriteLine("Checking using {0} mode: {1} on {2}", mode, status, date);
}
}
在 GitHub 上,您可以下载并试用完整的 验证 PDF 签名 C# 和 VB.NET 示例。
在 C# 中读取 PDF 签名属性
Docotic.Pdf 可以读取签名属性,例如签名者姓名、签名时间和签名者联系信息。也可以访问嵌入在签名中的签名证书。如果签名中嵌入了颁发者证书,库还可以检索该签名证书的颁发者证书。
本示例展示如何在 C# 中读取签名及其对应证书的属性:
using var pdf = new PdfDocument("signed.pdf");
PdfControl? control = pdf.GetControls().FirstOrDefault(c => c.Type == PdfWidgetType.Signature);
if (control is null)
{
Console.WriteLine("Document does not contain signature fields");
return;
}
PdfSignatureField field = (PdfSignatureField)control;
Console.WriteLine("Signature field is invisible: {0}", IsInvisible(field));
PdfSignature? signature = field.Signature;
if (signature is null)
{
Console.WriteLine("Signature field does not have an associated signature");
return;
}
Console.WriteLine("Signed by: {0}", signature.Name);
Console.WriteLine("Signing time: {0}", signature.SigningTime);
Console.WriteLine("Signed at: {0}", signature.Location);
Console.WriteLine("Reason for signing: {0}", signature.Reason);
Console.WriteLine("Signer's contact: {0}", signature.ContactInfo);
PdfSignatureContents contents = signature.Contents;
Console.WriteLine("Has OCSP embedded: {0}", contents.CheckHasEmbeddedOcsp());
Console.WriteLine("Has CRL embedded: {0}", contents.CheckHasEmbeddedCrl());
PdfSignatureCertificate certificate = contents.GetSigningCertificate();
Console.WriteLine("== Signing certificate:");
Console.WriteLine("Name: {0}", certificate.Name);
Console.WriteLine("Algorithm: {0}", certificate.AlgorithmName);
Console.WriteLine("Subject DN: {0}", certificate.Subject.Name);
Console.WriteLine("Issuer DN: {0}", certificate.Issuer.Name);
Console.WriteLine("Serial number: {0}", certificate.SerialNumber);
Console.WriteLine("Valid from {0} up to {1}", certificate.ValidFrom, certificate.ValidUpto);
Console.WriteLine("Timestamp Authority URL: {0}", certificate.GetTimestampAuthorityUrl());
PdfSignatureCertificate? issuer = contents.GetIssuerCertificateFor(certificate);
Console.WriteLine("== Issuer certificate:");
if (issuer == null)
{
Console.WriteLine("The issuer certificate is not embedded");
}
else
{
Console.WriteLine("Subject DN: {0}", issuer.Subject.Name);
Console.WriteLine("Issuer DN: {0}", issuer.Issuer.Name);
Console.WriteLine("Serial number: {0}", issuer.SerialNumber);
}
private static bool IsInvisible(PdfSignatureField field)
{
return (field.Width == 0 && field.Height == 0) ||
field.Flags.HasFlag(PdfWidgetFlags.Hidden) ||
field.Flags.HasFlag(PdfWidgetFlags.NoView);
}
从 GitHub 下载并试用完整的 在 C# 和 VB.NET 中读取 PDF 签名属性 示例。