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é falsifié. Vous pouvez utiliser la bibliothèque Docotic.Pdf 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 les applications .NET Framework et .NET Core. Obtenez la clé de licence gratuite à durée limitée ici pour essayer la bibliothèque sans restrictions du mode d'évaluation.

Vérifier la signature numérique en PDF

Valider la signature numérique en PDF à l'aide de C#

La bibliothèque Docotic.Pdf permet 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 son certificat de signature est révoqué à une date donnée.

L'exemple C# suivant montre comment vérifier une signature PDF et vérifier la révocation du certificat de signature :

using BitMiracle.Docotic.Pdf;

using (var pdf = new PdfDocument("signed.pdf"))
{
    PdfControl field = pdf.GetControls().FirstOrDefault(c => c.Type == PdfWidgetType.Signature);
    if (field == null)
    {
        Console.WriteLine("Document does not contain signature fields", "Verification result");
        return;
    }

    PdfSignature signature = ((PdfSignatureField)field).Signature;
    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);

    if (contents.Timestamp != null)
    {
        Console.WriteLine("Signature has timestamp embedded.");
        Console.WriteLine("Timestamp: {0}", contents.Timestamp);
        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 de Verify PDF signature en C# et VB.NET.

Lire les propriétés de signature PDF en C#

Docotic.Pdf peut lire les propriétés de la signature telles que le nom du signataire, l'heure de la signature, les coordonnées du signataire. Il est également possible d'accéder au certificat de signature intégré à la signature. La bibliothèque peut également récupérer le certificat d'émetteur du certificat de signature s'il est intégré à la signature.

Cet exemple montre comment lire la signature et les propriétés des certificats correspondants en C# :

using (var pdf = new PdfDocument("signed.pdf"))
{
    PdfControl control = pdf.GetControls().FirstOrDefault(c => c.Type == PdfWidgetType.Signature);
    if (control == 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;
    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:");
    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 de Lire les propriétés de signature PDF en C# et VB.NET à partir de GitHub.