長期検証
★ Pro — Commercial License Required
長期検証(LTV)にはProパッケージが必要です。
LTVは、証明書の期限切れや失効サービスのオフライン後も署名が検証可能であることを保証します。すべての検証データをドキュメントセキュリティストア(DSS)経由でPDFに埋め込みます。
LTVクラス
| クラス | 用途 |
|---|---|
LtvManager | チェーン構築、OCSP/CRL取得、DSSアセンブリの調整 |
DssBuilder | 証明書、OCSP、CRLを含むDSSディクショナリの構築 |
OcspClient | OCSPレスポンスの取得(RFC 6960) |
CrlFetcher | 配布ポイントからのCRLダウンロード(RFC 5280) |
LtvManager
B-LTまたはB-LTAレベルでは、LtvManagerはDigitalSigner内部で自動的に実行されます。手動制御の場合:
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証明書の期限切れ前に再タイムスタンプを行い、無期限の有効性を維持します:
Sign (B-B) -> TSA timestamp (B-T) -> DSS (B-LT) -> Document timestamp (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名前空間配下にあります。
次のステップ
- PAdES デジタル署名 -- すべてのPAdESレベルでの署名作成。
- PDF/A-4 アーカイブ -- LTVとアーカイブコンプライアンスの組み合わせ。
- HSM統合 -- LTVサポート付きハードウェアベース署名。