이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.

C# 및 VB.NET에서 PDF 서명 확인

PDF 문서의 디지털 서명을 사용하면 PDF가 변조되었는지 감지할 수 있습니다. Docotic.Pdf 라이브러리를 사용하여 PDF 파일의 디지털 서명을 확인할 수 있습니다. 라이브러리는 .NET Framework 및 .NET Core 애플리케이션에서 서명 속성을 읽는 데 도움이 될 수 있습니다. 평가 모드 제한 없이 라이브러리를 사용해 보려면 여기에서 시간 제한이 있는 무료 라이센스 키를 받으세요.

PDF에서 디지털 서명 확인

C#을 사용하여 PDF의 디지털 서명 유효성 검사

Docotic.Pdf 라이브러리는 서명 후 문서의 서명된 부분이 변경되었는지 확인하는 방법을 제공합니다. 서명에 내장된 OCSP 및/또는 CRL 데이터가 포함되어 있는지 확인할 수 있습니다. 그리고 모든 서명에 대해 특정 날짜에 서명 인증서가 폐기되었는지 확인할 수 있습니다.

Docotic.Pdf 라이브러리 9.3.17036-dev 회귀 테스트 14,665건의 테스트 통과 총 NuGet 다운로드 4,191,515

다음 C# 샘플은 PDF 서명을 확인하고 서명 인증서의 해지를 확인하는 방법을 보여줍니다:

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);
    }
}

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 서명 속성 읽기 샘플을 다운로드하여 사용해 보세요.