Cette page peut contenir du texte traduit automatiquement.
Vérifier la signature PDF en C# et VB.NET
Les signatures numériques dans les documents PDF vous permettent de détecter si le PDF a été altéré. Vous pouvez utiliser Docotic.Pdf library pour vérifier les signatures numériques dans les fichiers PDF. La bibliothèque peut vous aider à lire les propriétés de signature dans des applications .NET Framework et .NET Core. Obtenez la bibliothèque et une clé de licence gratuite à durée limitée sur la page Télécharger la bibliothèque PDF C# .NET.

Valider la signature numérique dans le PDF avec C#
La bibliothèque Docotic.Pdf fournit des moyens de vérifier si la partie signée d’un document a été modifiée après la signature. Vous pouvez vérifier si une signature contient des données OCSP et/ou CRL intégrées. Et pour toute signature, il est possible de vérifier si le certificat de signature est révoqué à une date donnée.
L’exemple C# suivant montre comment vérifier une signature PDF et contrôler la révocation du certificat de signature :
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);
}
}
Sur GitHub, vous pouvez télécharger et essayer les exemples complets Verify PDF signature en C# et VB.NET.
Lire les propriétés de la signature PDF en C#
Docotic.Pdf peut lire les propriétés de la signature, comme le nom du signataire, l’heure de signature et les coordonnées du signataire. Il est également possible d’accéder au certificat de signature incorporé dans la signature. La bibliothèque peut aussi récupérer le certificat de l’émetteur du certificat de signature s’il est incorporé dans la signature.
Cet exemple montre comment lire les propriétés de la signature et des certificats correspondants en 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);
}
Téléchargez et essayez les exemples complets Read PDF signature properties in C# and VB.NET depuis GitHub.