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

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

PDF 서명의 장기 검증(LTV) 정보는 디지털 서명이 생성된 지 오랜 시간이 지난 후에도 디지털 서명을 검증하는 데 도움이 됩니다. LTV가 없으면 서명자의 인증서가 만료되거나 해지 데이터를 더 이상 사용할 수 없게 되어 디지털 서명을 검증할 수 없게 됩니다. 이는 수년간 신뢰성을 유지해야 하는 법률 및 금융 PDF 문서에는 종종 용납되지 않는 부분입니다.

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

Docotic.Pdf 라이브러리 9.7.18373 회귀 테스트 15,244건의 테스트 통과 총 NuGet 다운로드 5,976,723

장기 유효성 검사(LTV)

PAdES - PDF 고급 전자 서명

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

LTV 서명의 핵심 개념은 유효성 검사 관련 정보(VRI)를 PDF에 내장하는 것입니다. 이 정보를 통해 서명 환경을 더 이상 사용할 수 없더라도 장기간이 지난 후에도 PDF 서명의 유효성을 검사할 수 있습니다.

ETSI EN 319 142-1 사양은 B-B, B-T, B-LT, B-LTA의 네 가지 수준의 PAdES 기준 서명을 정의합니다. 이 문서에서는 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) 응답
  • 인증서 해지 목록(CRLs)

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

PAdES-B-LTA

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

인증된 전자 서명은 이 수준에 해당합니다.

PAdES 유효성 검사

한 가지 방법은 Adobe Acrobat Pro 또는 Adobe Reader를 사용하는 것입니다. 서명 패널을 열고 디지털 서명을 확장하여 상태를 확인하는 것입니다. 서명이 유효하면 "서명이 LTV를 활성화했습니다" 또는 "서명이 LTV를 활성화하지 않았으며 만료됩니다"라는 메시지가 표시됩니다.

Adobe Reader에서 서명이 LTV를 활성화했습니다

또 다른 방법은 유럽 위원회의 PAdES 유효성 검사기를 사용하는 것입니다. 이 방법은 EU(eIDAS) 호환 문서의 유효성 검사에 가장 효과적입니다.

ETSI의 서명 적합성 검사기도 있습니다. 이 서비스는 서명 또는 유효성 검사 도구를 개발하는 개발자를 위해 설계되었습니다.

이러한 유효성 검사기는 동일한 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 신뢰 목록 브라우저를 사용하여 선택할 수 있습니다.

첫 번째 단계 후 중개 문서를 저장하는 것은 필수입니다. 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 문서에는 두 개의 서명이 포함되어 있습니다. 1단계의 주 서명과 3단계의 문서 타임스탬프 서명입니다. Adobe Acrobat에서 두 서명 모두에 "서명이 LTV를 지원합니다"라는 메시지가 표시되는 것을 볼 수 있습니다. 문서 타임스탬프 서명이 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);

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

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

기존 B-T 서명은 이 예시에서 사용된 것과 다른 임의의 TSA 를 사용할 수 있습니다. 이 경우 Adobe Acrobat은 문서 타임스탬프 서명에 대해 "서명이 LTV를 지원하지 않습니다"라는 메시지를 표시합니다.

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)으로 변환할 수 있습니다.

Docotic.Pdf 라이브러리를 사용하여 .NET 애플리케이션의 PDF 서명에 LTV 정보를 추가할 수 있습니다. LTV를 사용하여 PDF 문서를 인증할 수도 있습니다.

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

자주 묻는 질문

Adobe Acrobat에서 "서명 유효성을 알 수 없습니다" 메시지가 표시되지 않도록 하려면 어떻게 해야 하나요?

Adobe Acrobat은 서명자의 인증서를 확인할 수 없는 경우 "서명 유효성을 알 수 없습니다" 경고를 표시합니다. 이 문제는 일반적으로 인증서가 없거나, 신뢰할 수 없거나, 자체 서명되었거나, 해지되었거나, 만료되었거나, 아직 활성화되지 않은 경우 발생합니다.

올바른 인증서를 받으세요 경고를 피하거나 EU(eIDAS) 기준을 준수하는 문서를 생성하려면.

또는 Adobe Acrobat의 "신뢰할 수 있는 인증서"에 인증서를 수동으로 추가할 수 있습니다. 이 옵션은 메뉴 > 환경 설정 > 서명 > ID 및 신뢰할 수 있는 인증서에서 사용할 수 있습니다.

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

Adobe Acrobat에서 신뢰 설정 구성하기

PDF 서명의 LTV 지원 여부는 어떻게 확인하나요?

Adobe Reader 또는 유럽 위원회의 PAdES 유효성 검사기를 사용할 수 있습니다. 자세한 내용은 PAdES 유효성 검사 섹션을 참조하세요.

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

Adobe Acrobat은 서명 검증 과정의 일환으로 인증서 폐지 정보를 확인합니다. 데이터 다운로드가 필요한 경우, 해당 서명은 LTV 기능이 활성화되어 있지 않습니다.

PDF 서명을 ETSI 사양을 준수하도록 설정하려면 어떻게 해야 하나요?

PDF 고급 전자 서명 요구 사항을 따르세요. 유럽 연합 신뢰 목록(EUTL)에 등록된 공급업체에서 발급한 인증서를 사용해야 합니다.

Adobe Reader에서 "서명이 LTV를 활성화했습니다"라는 표시를 어떻게 설정하나요?

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

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

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

이 과정은 일반 PDF 서명과 유사합니다. 문서 타임스탬프 서명에 대한 LTV 정보를 DSS 사전에 추가해야 합니다.

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

LTV와 타임스탬핑을 동일한 작업으로 수행할 수 있나요?

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

C#에서 LTV 기능이 있는 디지털 서명을 생성하려면 어떻게 하나요?

Docotic.Pdf 라이브러리를 사용하세요. 고급 전자 서명을 생성하려면 PAdES-B-LT 서명 생성 방법 섹션의 코드 샘플을 참조하세요. 공인 전자 서명을 생성하려면 PAdES-B-LTA 서명 생성 방법 섹션을 확인하세요.

변경이 허용되지 않는" 상태에서 서명에 LTV 기능을 활성화하려면 어떻게 해야 하나요?

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

PDF 문서에 외부 서명할 때 장기 유효성 검사(LTV)를 활성화하려면 어떻게 해야 하나요?

Docotic.Pdf 라이브러리를 사용하여 USB 토큰, 스마트 카드 또는 클라우드 기반 HSM을 사용하여 PDF 문서에 LTV 서명을 하세요. C# 및 VB.NET에서 USB 토큰과 HSM 장치를 사용하여 PDF에 서명하는 방법 문서와 PAdES-B-LT 서명 생성 방법 섹션을 확인하세요.

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

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