Skip to content

Validation à long terme

Pro — Commercial License Required
La validation à long terme (LTV) nécessite le package Pro.

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

ClasseObjectif
LtvManagerOrchestre la construction de chaîne, récupération OCSP/CRL, assemblage DSS
DssBuilderConstruit le dictionnaire DSS avec certificats, OCSP, CRL
OcspClientRécupère les réponses OCSP (RFC 6960)
CrlFetcherTé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 :

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(); // construit et intègre le dictionnaire DSS

DssBuilder

Construit le dictionnaire DSS (ISO 32000-2) contenant /Certs, /OCSPs, /CRLs et entrées /VRI par signature optionnelles.

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 par signature optionnel
$dssDict = $dss->build();

OcspClient

Interroge les répondeurs OCSP pour vérifier le statut de révocation des certificats.

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', // 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.

php
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().

php
$ltv = new LtvManager($pdf);
$ltv->buildChain(signerCertificate: '/certs/signing.pem');
$chain = $ltv->chain(); // tableau de certificats encodés DER

Boucle 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]
php
$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

Distribué sous licence LGPL-3.0-or-later.