Skip to content

장기 검증

Pro — Commercial License Required
장기 검증(LTV)은 Pro 패키지가 필요합니다.

LTV는 인증서가 만료되거나 해지 서비스가 오프라인이 된 후에도 문서 보안 저장소(DSS)를 통해 모든 검증 데이터를 PDF에 임베딩하여 서명이 계속 검증 가능하도록 보장합니다.

LTV 클래스

클래스목적
LtvManager체인 구성, OCSP/CRL 가져오기, DSS 조립을 조율
DssBuilder인증서, OCSP, CRL을 포함하는 DSS 딕셔너리 구성
OcspClientOCSP 응답 가져오기 (RFC 6960)
CrlFetcher배포 지점에서 CRL 다운로드 (RFC 5280)

LtvManager

B-LT 또는 B-LTA 수준에서 LtvManagerDigitalSigner 내부에서 자동으로 실행됩니다. 수동 제어를 위한 방법:

php
use Yeeefang\TcpdfNext\Pro\Security\Ltv\LtvManager;

$ltv = new LtvManager($pdf);
$ltv->addCertificate(file_get_contents('/certs/intermediate.pem'));
$ltv->addCertificate(file_get_contents('/certs/root.pem'));
$ltv->addOcspResponse($ocspResponseDer);
$ltv->addCrl($crlDer);
$ltv->apply(); // DSS 딕셔너리를 구성하고 임베딩

DssBuilder

/Certs, /OCSPs, /CRLs 및 선택적 서명별 /VRI 항목을 포함하는 DSS 딕셔너리(ISO 32000-2)를 구성합니다.

php
use Yeeefang\TcpdfNext\Pro\Security\Ltv\DssBuilder;

$dss = new DssBuilder();
$dss->addCertificate($intermediateDer);
$dss->addOcspResponse($ocspDer);
$dss->addCrl($crlDer);
$dss->addVri($sigHash, [$signerDer], [$ocspDer], [$crlDer]); // 선택적 서명별 VRI
$dssDict = $dss->build();

OcspClient

OCSP 응답자에 쿼리하여 인증서 해지 상태를 확인합니다.

php
use Yeeefang\TcpdfNext\Pro\Security\Ltv\OcspClient;

$ocsp = new OcspClient();
$ocsp->timeout(10);
$ocsp->cacheDir('/tmp/ocsp-cache');

$response = $ocsp->query(
    certificate:  '/certs/signing.pem',
    issuer:       '/certs/intermediate.pem',
    responderUrl: 'https://ocsp.example.com', // 선택사항; 생략 시 AIA에서 추출
);

echo $response->status();     // 'good', 'revoked', 또는 'unknown'
echo $response->producedAt(); // DateTimeImmutable
$derBytes = $response->toDer();

CrlFetcher

인증서에 선언된 CDP에서 CRL을 다운로드하며, 선택적 디스크 캐싱을 지원합니다.

php
use Yeeefang\TcpdfNext\Pro\Security\Ltv\CrlFetcher;

$fetcher = new CrlFetcher();
$fetcher->cacheDir('/tmp/crl-cache');
$fetcher->cacheTtl(86400); // 24시간

$crl = $fetcher->fetchForCertificate('/certs/signing.pem');
echo $crl->issuerDN();
echo $crl->revokedCount();
$crl->isRevoked('01:AB:CD:EF'); // bool
$derBytes = $crl->toDer();

인증서 체인 구성

LtvManager는 AIA caIssuers 확장을 따라 중간 인증서를 자동으로 검색합니다. 아웃바운드 HTTP가 제한된 경우 CertificateInfo::chain()을 통해 체인을 수동으로 제공하세요.

php
$ltv = new LtvManager($pdf);
$ltv->buildChain(signerCertificate: '/certs/signing.pem');
$chain = $ltv->chain(); // DER 인코딩된 인증서 배열

아카이브 루프 (B-LTA)

B-LTA는 DSS 임베딩 후에 문서 타임스탬프를 추가합니다. TSA 인증서가 만료되기 전에 재타임스탬프를 수행하여 무기한 유효성을 유지합니다:

서명 (B-B) -> TSA 타임스탬프 (B-T) -> DSS (B-LT) -> 문서 타임스탬프 (B-LTA)
    -> [만료 전 재타임스탬프]
php
$ltv = LtvManager::load('/archive/contract-2026.pdf');
$ltv->retimestamp(new TsaClient('https://tsa.example.com/timestamp'));
$ltv->save('/archive/contract-2026.pdf');

오류 처리

LTV 작업은 타입이 지정된 예외를 발생시킵니다: OcspException (응답자 연결 불가), CrlException (다운로드 실패), 또는 ChainBuildException (불완전한 체인). 모두 Yeeefang\TcpdfNext\Pro\Security\Ltv 네임스페이스 하위에 있습니다.

다음 단계

LGPL-3.0-or-later 라이선스로 배포됩니다.