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

C# 및 VB.NET에서 PDF 서명에 장기 검증(PAdES-LTV) 정보 추가

PDF 서명의 장기 검증(LTV) 정보는 생성 후 오랜 시간이 지난 디지털 서명도 검증하는 데 도움이 됩니다. LTV가 없으면 서명자의 인증서가 만료되거나 해지 데이터가 더 이상 उपलब्ध하지 않게 되는 순간 디지털 서명을 검증할 수 없게 됩니다. 이는 수년간 신뢰성을 유지해야 하는 법률 및 금융 PDF 문서에서는 종종 허용될 수 없습니다.

장기 검증(LTV)

이 문서는 이론과 실무의 두 부분으로 구성됩니다. 먼저 PAdES-LTV 서명에 대한 기본 정보를 배웁니다. 그런 다음 Docotic.Pdf library를 사용하여 C#에서 PDF 서명에 LTV 정보를 추가하는 방법을 살펴봅니다. 라이브러리와 무료 기간 제한 라이선스 키는 C# .NET PDF 라이브러리 다운로드 페이지에서 받을 수 있습니다.

PAdES - PDF 고급 전자 서명

유럽전기통신표준협회(ETSI)는 전자 서명에 대한 여러 표준을 발표했습니다. 특히 이 협회는 ETSI EN 319 142 사양에서 PDF 고급 전자 서명(PAdES) 표준을 정의합니다. PAdES는 유럽 eIDAS 규정을 준수하는 PDF 서명을 만드는 방법을 설명합니다.

LTV 서명의 핵심 개념은 검증 관련 정보(VRI)를 PDF에 포함하는 것입니다. 이 정보는 서명 환경을 더 이상 사용할 수 없는 경우에도 오랜 시간이 지난 후 PDF 서명을 검증할 수 있게 해줍니다.

ETSI EN 319 142-1 사양은 PAdES 기본 서명의 네 가지 수준인 B-B, B-T, B-LT, B-LTA를 정의합니다. 이 문서에서는 PDF에서 LTV를 지원하는 서명과 관련된 B-LT 및 B-LTA 수준에 초점을 맞추겠습니다.

PAdES-B-B

ETSI.CAdES.detached 형식의 단기 디지털 PDF 서명은 이 수준에 해당합니다. C# 및 VB.NET에서 PDF 문서에 서명 문서에서는 이러한 서명을 만드는 방법을 설명합니다.

PAdES-B-T

B-T 서명은 B-B 수준 요구 사항을 충족해야 하며, 타임스탬프를 포함해야 합니다.

PAdES-B-LT

B-LT 서명은 B-T 수준을 준수해야 합니다. 또한 PDF 파일에는 다음 데이터를 포함하는 문서 보안 저장소(DSS) 사전이 있어야 합니다.

  • 신뢰 체인의 모든 인증서
  • 온라인 인증서 상태 프로토콜(OCSP) 응답
  • 인증서 해지 목록(CRL)

고급 전자 서명은 이 수준에 해당합니다.

PAdES-B-LTA

B-LTA 서명은 B-LT 수준을 준수해야 합니다. 또한 PDF 파일에는 문서 타임스탬프 서명과 VRI 가 포함되어야 합니다.

적격 전자 서명은 이 수준에 해당합니다.

PAdES Validation

한 가지 방법은 Adobe Acrobat Pro 또는 Adobe Reader를 사용하는 것입니다. 서명 패널을 열고 디지털 서명을 확장하여 상태를 확인합니다. 서명이 유효하면 "Signature is LTV enabled" 또는 "Signature is not LTV enabled and will expire after" 중 하나가 표시됩니다.

Adobe Reader에서 LTV가 활성화된 서명

다른 방법으로는 유럽연합 집행위원회의 PAdES validator를 사용할 수 있습니다. 이 방법은 EU(eIDAS) 호환 문서를 검증할 때 가장 효과적입니다.

또한 ETSI의 Signatures Conformance Checker도 있습니다. 이 서비스는 주로 서명 또는 검증 도구를 개발하는 개발자를 위해 설계되었습니다.

이 검증 도구들은 같은 PDF 문서에 대해 서로 다른 결과를 제공할 수 있습니다.

말은 쉽다. 코드를 보여 주세요.

C# 및 VB.NET에서 LTV 지원 PDF 서명 만들기

이제 코드를 작성할 차례입니다! Docotic.Pdf는 PDF 서명에 LTV 정보를 추가하기 위한 PdfDocument.AddLtvInfo 메서드를 제공합니다. B-LTA 서명을 만들려면 문서 타임스탬프 서명이 포함된 PDF를 저장하기 위한 PdfDocument.TimestampAndSave 메서드도 필요합니다.

C#에서 PAdES-B-LT 서명을 만드는 방법

B-LT 서명을 만드는 과정은 세 단계로 구성됩니다.

  1. B-T 서명을 만들고 문서를 저장합니다.
  2. 서명된 문서를 열고 LTV 정보를 추가합니다.
  3. 최종 문서를 증분 저장합니다.

다음은 B-LT 서명을 만드는 C# 코드입니다. GitHub에서 전체 LTV 지원 PDF 서명 만들기 샘플 프로젝트도 다운로드할 수 있습니다:

// 1. PAdES-B-T 서명 만들기
using var step1 = new MemoryStream();
using (var pdf = new PdfDocument())
{
    var options = new PdfSigningOptions(..)
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.CadesDetached,
    };
    options.Timestamp.AuthorityUrl = new Uri("http://timestamp.digicert.com");

    pdf.SignAndSave(options, step1);
}

// 2. 서명된 문서를 열고 LTV 정보 추가
using (var pdf = new PdfDocument(step1))
{
    pdf.AddLtvInfo();

    // 3. 최종 문서를 증분 저장
    var incrementalOptions = new PdfSaveOptions()
    {
        WriteIncrementally = true,
    };
    pdf.Save("b-lt.pdf", incrementalOptions);
}

고려해야 할 핵심 사항이 몇 가지 있습니다. 먼저 PKCS#12 인증서(.pfx 또는 .p12 파일)나 외부 서명자를 사용하여 PdfSigningOptions를 만들 수 있습니다. 어떤 방법을 사용하든 PAdES 준수를 위해 Format 옵션은 반드시 PdfSignatureFormat.CadesDetached로 설정해야 합니다.

이 코드 조각은 http://timestamp.digicert.com를 사용하지만, 다른 타임스탬프 기관(TSA)을 사용해도 됩니다. 널리 사용되는 대안은 다음과 같습니다.

http://timestamp.comodoca.com/rfc3161
http://timestamp.sectigo.com
http://timestamp.entrust.net/TSS/RFC3161sha2TS
http://rfc3161timestamp.globalsign.com/advanced

ETSI 사양을 준수하려면 eIDAS 승인 TSA를 사용해야 합니다. EU/EEA Trusted List Browser에서 하나를 선택할 수 있습니다.

첫 번째 단계 후 중간 문서를 저장하는 것은 필수입니다. LTV 정보를 추가하기 전에 문서에 서명하고 저장해야 합니다. 하지만 이 규칙에는 예외가 하나 있으며, 이는 아래 LTV를 사용한 PDF 인증 섹션에서 설명합니다.

3단계의 WriteIncrementally = true 줄은 증분 저장을 활성화합니다. 증분 업데이트는 디지털 서명을 무효화하지 않습니다. LTV 정보를 추가할 때는 항상 PDF 파일을 증분 저장해야 합니다.

C#에서 PAdES-B-LTA 서명을 만드는 방법

B-LTA 서명 생성은 3단계를 제외하면 비슷합니다. 다음을 수행해야 합니다.

  1. B-T 서명을 만들고 문서를 저장합니다.
  2. 서명된 문서를 열고 LTV 정보를 추가합니다.
  3. 최종 문서를 문서 타임스탬프 서명과 함께 증분 저장합니다.

다음 코드 샘플은 C#에서 B-LTA 서명을 만드는 방법을 보여줍니다:

var timestampAuthorityUrl = new Uri("http://timestamp.digicert.com");

// 1. PAdES-B-T 서명 만들기
using var step1 = new MemoryStream();
using (var pdf = new PdfDocument())
{
    var options = new PdfSigningOptions(..)
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.CadesDetached,
    };
    options.Timestamp.AuthorityUrl = timestampAuthorityUrl;

    pdf.SignAndSave(options, step1);
}

// 2. 서명된 문서를 열고 LTV 정보 추가
using (var pdf = new PdfDocument(step1))
{
    pdf.AddLtvInfo();

    // 3. 문서 타임스탬프 서명과 함께 최종 문서를 증분 저장
    var timestampOptions = new PdfSignatureTimestampOptions
    {
        AuthorityUrl = timestampAuthorityUrl,
    };
    var incrementalOptions = new PdfSaveOptions()
    {
        WriteIncrementally = true,
    };
    pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}

최종 b-lta.pdf 문서에는 두 개의 서명, 즉 첫 번째 단계의 मुख्य 서명과 세 번째 단계의 문서 타임스탬프 서명이 포함됩니다. Adobe Acrobat이 두 서명 모두에 대해 "Signature is LTV enabled" 메시지를 표시하는 것을 볼 수 있을 것입니다. AddLtvInfo 호출 이후에 생성된 문서 타임스탬프 서명이 어떻게 LTV를 지원할 수 있을까요?

핵심은 서명 타임스탬프와 문서 타임스탬프 모두에 동일한 TSA 를 사용하는 것입니다. AddLtvInfo 메서드는 타임스탬프 인증서에 대한 VRI 를 추가합니다. 그런 다음 문서 타임스탬프는 동일한 인증서를 사용하고 관련 데이터를 재사용합니다.

문서 타임스탬프에 동일한 TSA를 사용할 수 없나요? 이 경우는 PAdES-B-T를 B-LTA로 변환 섹션에서 살펴보겠습니다.

C# 및 VB.NET에서 기존 PDF 서명에 LTV 정보 추가

지금까지는 LTV가 활성화된 서명을 처음부터 만들었습니다. 하지만 기존 PAdES-B-T 서명을 수정해야 하는 경우가 자주 있습니다. 예를 들어 B-LT 또는 B-LTA로 변환하거나 LTV 정보를 갱신해야 할 수 있습니다.

이전 예제와 마찬가지로 다음을 수행해야 합니다.

  1. 서명된 문서를 열고 LTV 정보를 추가합니다.
  2. 문서 타임스탬프 서명 유무와 관계없이 최종 문서를 증분 저장합니다.

해당 코드 조각은 다음과 같습니다.

C#에서 PAdES-B-T 서명을 B-LT로 변환하는 방법

using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();

var incrementalOptions = new PdfSaveOptions()
{
    WriteIncrementally = true,
};
pdf.Save("b-lt.pdf", incrementalOptions);

C#에서 PAdES-B-T 서명을 B-LTA로 변환하는 방법

using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();

var timestampOptions = new PdfSignatureTimestampOptions
{
    AuthorityUrl = new Uri("http://timestamp.digicert.com"),
};
var incrementalOptions = new PdfSaveOptions()
{
    WriteIncrementally = true,
};
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);

전체 기존 서명에 LTV 정보를 추가합니다 샘플 프로젝트를 GitHub에서 다운로드하세요.

문서 타임스탬프 서명에 LTV 정보 추가

기존 B-T 서명은 이 예제에서 사용한 것과 다른 임의의 TSA 를 사용할 수 있습니다. 이런 경우 Adobe Acrobat은 문서 타임스탬프 서명에 대해 "Signature is not LTV enabled" 메시지를 표시합니다.

이를 LTV 지원으로 만들려면 어떻게 해야 할까요? 문서 타임스탬프 서명에 LTV 정보를 추가해야 합니다.

var timestampOptions = new PdfSignatureTimestampOptions
{
    AuthorityUrl = new Uri("http://timestamp.digicert.com"),
};
var incrementalOptions = new PdfSaveOptions()
{
    WriteIncrementally = true,
};

using var intermediate = new MemoryStream();
using (var pdf = new PdfDocument("b-t.pdf"))
{
    pdf.AddLtvInfo();
    pdf.TimestampAndSave(timestampOptions, intermediate, incrementalOptions);
}

// 문서 타임스탬프 서명에 LTV 정보 추가
using (var pdf = new PdfDocument(intermediate))
{
    pdf.AddLtvInfo();
    pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}

C# 및 VB.NET에서 LTV를 사용한 PDF 인증

인증된 PDF 문서의 디지털 서명은 어떤 수정도 허용하지 않습니다. PDF 리더 응용 프로그램은 이러한 서명을 특수 아이콘과 함께 표시하며, 캡션은 "Certified by"로 시작합니다.

Adobe Acrobat에 표시된 인증된 PDF 서명

인증된 PDF를 변경하면 서명이 무효화되므로, 인증을 깨지 않고는 LTV 정보를 추가할 수 없습니다.

Docotic.Pdf는 LTV 정보를 포함하는 인증된 PDF 문서를 생성하는 기능을 제공합니다. 서명 중에 LTV 정보를 추가하려면 AddLtvInfo(PdfSigningOptions) 오버로드를 사용하세요. 다음 코드 샘플은 C#에서 B-LT 서명으로 PDF를 인증하는 방법을 보여줍니다.

using var pdf = new PdfDocument();

var options = new PdfSigningOptions(..)
{
    DigestAlgorithm = PdfDigestAlgorithm.Sha256,
    Format = PdfSignatureFormat.CadesDetached,
    Type = PdfSignatureType.AuthorNoChanges,
};
options.Timestamp.AuthorityUrl = new Uri("http://timestamp.digicert.com");

pdf.AddLtvInfo(options);

pdf.SignAndSave(options, "certified-b-lt.pdf");

GitHub에서 LTV 서명으로 PDF 인증 코드 샘플을 살펴보세요.

2025년 6월 현재 Adobe Acrobat은 B-LT 서명이 포함된 인증된 PDF 문서를 지원하지만, 인증된 문서의 B-LTA 서명은 유효하지 않은 것으로 간주합니다.

결론

PDF 서명에 장기 검증(LTV) 정보를 추가하면 법적 준수와 장기 신뢰성을 보장할 수 있습니다. PAdES 표준은 PDF 서명에 대한 규칙과 준수 수준을 정의합니다.

최소한 PAdES-B-T 서명으로 서명하는 것이 권장됩니다. B-T 서명은 기존 검증을 깨지 않고 고급 전자 서명(B-LT) 또는 적격 전자 서명(B-LTA)으로 변환할 수 있습니다.

.NET 애플리케이션에서 PDF 서명에 LTV 정보를 추가하려면 Docotic.Pdf library를 사용하세요. LTV가 포함된 PDF 문서도 인증할 수 있습니다.

GitHub에서 PDF 디지털 서명 코드 샘플을 살펴보세요. 추가 정보는 관련 문서를 확인하세요:

자주 묻는 질문

Adobe Acrobat에서 "Signature validity is unknown" 메시지를 피하려면 어떻게 해야 하나요?

Adobe Acrobat은 서명자의 인증서를 검증할 수 없을 때 "Signature validity is unknown" 경고를 표시합니다. 이는 일반적으로 인증서가 없거나, 신뢰할 수 없거나, 자체 서명되었거나, 해지되었거나, 만료되었거나, 아직 활성화되지 않았을 때 발생합니다.

경고를 피하려면 올바른 인증서를 받거나 EU(eIDAS) 호환 문서를 만드세요.

또는 Adobe Acrobat의 "Trusted Certificates"에 인증서를 수동으로 추가할 수 있습니다. 이 옵션은 Menu > Preferences > Signatures > Identities & Trusted Certificates에서 사용할 수 있습니다.

인증된 문서용 인증서를 신뢰해야 하는 경우 해당 권한을 부여해야 합니다.

Adobe Acrobat에서 신뢰 설정 구성

PDF 서명이 LTV 지원인지 어떻게 확인하나요?

Adobe Reader 또는 유럽연합 집행위원회의 PAdES validator를 사용할 수 있습니다. 자세한 내용은 PAdES 검증 섹션을 참조하세요.

Adobe Acrobat에서 "서명이 LTV를 지원하지 않습니다"가 표시되는 이유는 무엇인가요?

Adobe Acrobat은 서명 검증 과정의 일부로 해지 정보를 확인합니다. 데이터를 다운로드해야 하는 경우 해당 서명은 LTV를 지원하지 않습니다.

PDF 서명을 ETSI 사양에 맞게 하려면 어떻게 해야 하나요?

PDF 고급 전자 서명 요구 사항을 따르세요. European Union Trusted Lists (EUTL)에 나열된 공급자가 발급한 인증서를 사용해야 합니다.

Adobe Reader에서 "Signature is LTV enabled" 표시를 얻으려면 어떻게 해야 하나요?

먼저 서명은 최소한 PAdES-B-T 수준을 충족해야 합니다. 그런 다음 신뢰 체인의 모든 인증서, OCSP 응답, 그리고 CRLs 을 포함한 LTV 정보를 추가해야 합니다.

C# 및 VB.NET에서 LTV 지원 PDF 서명 만들기기존 PDF 서명에 LTV 정보 추가 섹션에서는 C# 및 VB.NET에서 LTV 정보를 추가하는 방법을 설명합니다.

문서 타임스탬프 서명에 대해 LTV를 활성화하려면 어떻게 해야 하나요?

프로세스는 일반 PDF 서명과 비슷합니다. 문서 타임스탬프 서명에 대한 LTV 정보를 다음 DSS 사전에 추가해야 합니다.

문서 타임스탬프 서명에 LTV 정보 추가 섹션의 코드 샘플을 참조하세요.

같은 작업에서 LTV와 타임스탬프를 동시에 수행할 수 있나요?

예! PAdES-B-T 서명을 B-LTA로 변환하는 방법 섹션의 코드 샘플을 확인하세요.

C#에서 LTV가 포함된 디지털 서명을 만들려면 어떻게 해야 하나요?

Docotic.Pdf library를 사용하세요. 고급 전자 서명을 만들려면 PAdES-B-LT 서명을 만드는 방법 섹션의 코드 샘플을 살펴보세요. 적격 전자 서명을 만들려면 PAdES-B-LTA 서명을 만드는 방법 섹션을 확인하세요.

"변경 불가" 상태에서 서명할 때 LTV를 활성화하려면 어떻게 해야 하나요?

인증된 문서의 경우 Adobe Acrobat은 모든 LTV 데이터가 원본 서명된 문서에 포함되어야 합니다. 자세한 내용은 LTV를 사용한 PDF 인증 섹션을 읽어보세요.

PDF 문서를 외부에서 서명할 때 Long-Term Validation(LTV)을 활성화하려면 어떻게 해야 하나요?

Docotic.Pdf library를 사용하여 USB 토큰, 스마트 카드 또는 클라우드 기반 HSM으로 LTV가 포함된 PDF 문서에 서명하세요. C# 및 VB.NET에서 USB 토큰과 HSM 장치로 PDF에 서명하는 방법 문서와 PAdES-B-LT 서명을 만드는 방법 섹션을 확인하세요.

여러 서명이 있는 PDF에 서명하고 LTV를 활성화하려면 어떻게 해야 하나요?

여러 사람이 PDF 양식에 서명기존 서명에 LTV 정보를 추가합니다 코드 샘플을 결합하세요.