このページには自動翻訳されたテキストを含めることができます。

C# および VB.NET で PDF 署名を検証する

PDF ドキュメント内のデジタル署名を使用すると、PDF が改ざんされたかどうかを検出できます。 Docotic.Pdf ライブラリ を使用して、PDF ファイルのデジタル署名を検証できます。 こ のライブラリは、.NET Framework および .NET Core アプリケーションの署名プロパティを読み取るのに役立 ちます。 C# .NET PDF ライブラリをダウンロード ページでライブラリと無料の期間限定ライセンス キーを入手してください。

PDF のデジタル署名を検証する

C# を使用して PDF のデジタル署名を検証する

Docotic.Pdf ライブラリは、文書の署名部分が署名後に変更されたかどうかを確認する手段を提供します。 署 名に埋め込み OCSP や CRL データが含まれているかどうかを確認できます。 また、どの署名についても、そ の署名証明書が特定の日に失効しているかどうかを確認することができます。

Docotic.Pdf ライブラリ 9.6.18142-dev 回帰テスト 15,090人が合格 NuGet の合計ダウンロード数 5,742,298

次の 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 では、C# および VB.NET で完全な PDF 署名の検証 サンプルをダウンロー ドして試すことができます。

C# で PDF 署名プロパティを読み取る

Docotic.Pdf は、署名者の名前、署名時刻、署名者の連絡先情報などの署名プロパティを読み取ることができ ます。 署名に埋め込まれた署名証明書にアクセスすることもできます。 ライブラリは、署名証明書が署名に 埋め込まれている場合は、署名証明書の発行者証明書を取得することもできます。

このサンプルは、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);
}

GitHub から完全な C# および VB.NET での PDF 署名プロパティの読み取 り サンプルをダウンロードして試してください。