Validation à long terme
LTV garantit que les signatures restent vérifiables après l'expiration des certificats ou la mise hors ligne des services de révocation en intégrant toutes les données de validation dans le PDF via le Document Security Store (DSS).
Classes LTV
| Classe | Objectif |
|---|---|
LtvManager | Orchestre la construction de chaîne, récupération OCSP/CRL, assemblage DSS |
DssBuilder | Construit le dictionnaire DSS avec certificats, OCSP, CRL |
OcspClient | Récupère les réponses OCSP (RFC 6960) |
CrlFetcher | Télécharge les CRL depuis les points de distribution (RFC 5280) |
LtvManager
Aux niveaux B-LT ou B-LTA, LtvManager s'exécute automatiquement dans DigitalSigner. Pour un contrôle manuel :
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(); // construit et intègre le dictionnaire DSSDssBuilder
Construit le dictionnaire DSS (ISO 32000-2) contenant /Certs, /OCSPs, /CRLs et entrées /VRI par signature optionnelles.
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 par signature optionnel
$dssDict = $dss->build();OcspClient
Interroge les répondeurs OCSP pour vérifier le statut de révocation des certificats.
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', // optionnel ; extrait de AIA si omis
);
echo $response->status(); // 'good', 'revoked' ou 'unknown'
echo $response->producedAt(); // DateTimeImmutable
$derBytes = $response->toDer();CrlFetcher
Télécharge les CRL depuis le CDP déclaré dans les certificats, avec mise en cache disque optionnelle.
use Yeeefang\TcpdfNext\Pro\Security\Ltv\CrlFetcher;
$fetcher = new CrlFetcher();
$fetcher->cacheDir('/tmp/crl-cache');
$fetcher->cacheTtl(86400); // 24 heures
$crl = $fetcher->fetchForCertificate('/certs/signing.pem');
echo $crl->issuerDN();
echo $crl->revokedCount();
$crl->isRevoked('01:AB:CD:EF'); // bool
$derBytes = $crl->toDer();Construction de chaîne de certificats
LtvManager suit l'extension AIA caIssuers pour découvrir automatiquement les intermédiaires. Si HTTP sortant est restreint, fournissez la chaîne manuellement via CertificateInfo::chain().
$ltv = new LtvManager($pdf);
$ltv->buildChain(signerCertificate: '/certs/signing.pem');
$chain = $ltv->chain(); // tableau de certificats encodés DERBoucle d'archivage (B-LTA)
B-LTA ajoute un horodatage de document après l'intégration DSS. Réhorodatez avant l'expiration du certificat TSA pour maintenir la validité indéfiniment :
Sign (B-B) -> TSA timestamp (B-T) -> DSS (B-LT) -> Document timestamp (B-LTA)
-> [réhorodater avant expiration]$ltv = LtvManager::load('/archive/contract-2026.pdf');
$ltv->retimestamp(new TsaClient('https://tsa.example.com/timestamp'));
$ltv->save('/archive/contract-2026.pdf');Gestion des erreurs
Les opérations LTV lancent des exceptions typées : OcspException (répondeur inaccessible), CrlException (téléchargement échoué) ou ChainBuildException (chaîne incomplète). Toutes sont sous l'espace de noms Yeeefang\TcpdfNext\Pro\Security\Ltv.
Prochaines étapes
- Signatures numériques PAdES -- Création de signature à tous les niveaux PAdES.
- Archivage PDF/A-4 -- Combiner LTV avec conformité d'archivage.
- Intégration HSM -- Signature matérielle avec support LTV.