Long-Term Validation
LTV garantisce che le firme rimangano verificabili dopo che i certificati scadono o i servizi revoca vanno offline incorporando tutti i dati validazione nel PDF tramite il Document Security Store (DSS).
Classi LTV
| Classe | Scopo |
|---|---|
LtvManager | Orchestra costruzione catena, recupero OCSP/CRL, assemblaggio DSS |
DssBuilder | Costruisce il dizionario DSS con certificati, OCSP, CRL |
OcspClient | Recupera risposte OCSP (RFC 6960) |
CrlFetcher | Scarica CRL dai punti distribuzione (RFC 5280) |
LtvManager
Ai livelli B-LT o B-LTA, LtvManager viene eseguito automaticamente dentro DigitalSigner. Per controllo manuale:
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(); // costruisce e incorpora il dizionario DSSDssBuilder
Costruisce il dizionario DSS (ISO 32000-2) contenente /Certs, /OCSPs, /CRLs ed entry /VRI opzionali per-firma.
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 opzionale per-firma
$dssDict = $dss->build();OcspClient
Interroga responder OCSP per controllare stato revoca certificato.
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', // opzionale; estratto da AIA se omesso
);
echo $response->status(); // 'good', 'revoked', o 'unknown'
echo $response->producedAt(); // DateTimeImmutable
$derBytes = $response->toDer();CrlFetcher
Scarica CRL dal CDP dichiarato nei certificati, con caching disco opzionale.
use Yeeefang\TcpdfNext\Pro\Security\Ltv\CrlFetcher;
$fetcher = new CrlFetcher();
$fetcher->cacheDir('/tmp/crl-cache');
$fetcher->cacheTtl(86400); // 24 ore
$crl = $fetcher->fetchForCertificate('/certs/signing.pem');
echo $crl->issuerDN();
echo $crl->revokedCount();
$crl->isRevoked('01:AB:CD:EF'); // bool
$derBytes = $crl->toDer();Costruzione Catena Certificati
LtvManager segue l'estensione AIA caIssuers per scoprire intermedi automaticamente. Se HTTP in uscita è limitato, fornisci la catena manualmente tramite CertificateInfo::chain().
$ltv = new LtvManager($pdf);
$ltv->buildChain(signerCertificate: '/certs/signing.pem');
$chain = $ltv->chain(); // array di certificati DER-encodedLoop Archiviale (B-LTA)
B-LTA aggiunge un timestamp documento dopo l'incorporamento DSS. Ri-timestampa prima che il certificato TSA scada per mantenere validità indefinitamente:
Sign (B-B) -> TSA timestamp (B-T) -> DSS (B-LT) -> Document timestamp (B-LTA)
-> [ri-timestampa prima scadenza]$ltv = LtvManager::load('/archive/contract-2026.pdf');
$ltv->retimestamp(new TsaClient('https://tsa.example.com/timestamp'));
$ltv->save('/archive/contract-2026.pdf');Gestione Errori
Le operazioni LTV lanciano eccezioni tipizzate: OcspException (responder irraggiungibile), CrlException (download fallito), o ChainBuildException (catena incompleta). Tutte sono sotto il namespace Yeeefang\TcpdfNext\Pro\Security\Ltv.
Prossimi Passi
- Firme Digitali PAdES -- Creazione firma a tutti i livelli PAdES.
- Archiviazione PDF/A-4 -- Combina LTV con conformità archiviale.
- Integrazione HSM -- Firma basata su hardware con supporto LTV.