Signatures numériques (HasSecurity)
Le trait HasSecurity fournit setSignature() pour les signatures numériques conformes PAdES. TCPDF-Next supporte quatre niveaux de signature — du basique (B-B) à l'archivage (B-LTA) — via PadesOrchestrator, TsaClient et les modules LTV. Toutes les méthodes de signature retournent static pour le chaînage.
Référence rapide
| Classe / Enum | Objectif |
|---|---|
CertificateInfo | Charger les certificats de signature (PEM ou PKCS#12) |
SignatureLevel | Enum: PAdES_B_B, PAdES_B_T, PAdES_B_LT, PAdES_B_LTA |
TsaClient | Client d'autorité d'horodatage RFC 3161 |
SignatureAppearance | Widget de signature visible ou invisible |
OcspClient | Vérification de révocation en ligne RFC 6960 |
CrlFetcher | Récupération de point de distribution CRL RFC 5280 |
Niveaux de signature
| Niveau | Ce qu'il inclut | Validité |
|---|---|---|
| B-B (Basique) | Signature + certificat de signature | Valide tant que le certificat n'est pas révoqué |
| B-T (Horodatage) | B-B + horodatage RFC 3161 | Prouve que la signature existait avant un point dans le temps |
| B-LT (Long terme) | B-T + DSS avec réponses OCSP/CRL | Vérifiable après expiration du certificat |
| B-LTA (Archivage) | B-LT + horodatage document + boucle d'archivage | Vérifiable indéfiniment |
Cycle de vie de signature PAdES
sequenceDiagram
participant App
participant Core
participant TSA as Serveur TSA
participant OCSP as Répondeur OCSP
App->>Core: sign(certificate, key)
Core->>Core: PAdES B-B (intégré)
Core->>TSA: Horodatage RFC 3161
TSA-->>Core: Token horodatage
Core->>Core: PAdES B-T
Core->>OCSP: Vérification certificat
OCSP-->>Core: Réponse OCSP
Core->>Core: PAdES B-LT
Core->>Core: PAdES B-LTA (archive)Chargement des certificats
Depuis fichiers PEM
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;
$cert = CertificateInfo::fromFiles(
certPath: '/path/to/certificate.pem',
keyPath: '/path/to/private-key.pem',
password: 'key-password',
extraCerts: '/path/to/ca-chain.pem', // certificats intermédiaires optionnels
);Depuis PKCS#12 (.p12 / .pfx)
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;
$cert = CertificateInfo::fromPkcs12(
p12Path: '/path/to/certificate.p12',
password: 'pkcs12-password',
);Exemples de signature
use Yeeefang\TcpdfNext\Core\Document;
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;
use Yeeefang\TcpdfNext\Contracts\SignatureLevel;
use Yeeefang\TcpdfNext\Security\Timestamp\TsaClient;
$cert = CertificateInfo::fromFiles(
certPath: '/path/to/certificate.pem',
keyPath: '/path/to/private-key.pem',
password: 'key-password',
);
// PAdES B-B (Basique) — signature uniquement
$pdf = Document::create()
->setSignature($cert, SignatureLevel::PAdES_B_B)
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Document signé (B-B)')
->save('signed-bb.pdf');
// PAdES B-T (Horodatage) — signature + horodatage
$tsa = new TsaClient('https://freetsa.org/tsr');
$pdf = Document::create()
->setSignature($cert, SignatureLevel::PAdES_B_T, $tsa)
->addPage()
->cell(0, 10, 'Signé avec horodatage (B-T)')
->save('signed-bt.pdf');
// PAdES B-LTA (Archivage) — validation long terme complète
$pdf = Document::create()
->setSignature($cert, SignatureLevel::PAdES_B_LTA, $tsa)
->addPage()
->cell(0, 10, 'Signature d'archivage (B-LTA)')
->save('signed-blta.pdf');Le TsaClient supporte l'authentification optionnelle. La vérification nonce et l'épinglage DNS sont activés par défaut pour prévenir les attaques par rejeu et SSRF.
$tsa = new TsaClient(
url: 'https://tsa.example.com/timestamp',
user: 'tsa-user',
pass: 'tsa-password',
);Validation long terme (B-LT / B-LTA)
Pour les niveaux B-LT et B-LTA, les données de révocation sont récupérées et intégrées automatiquement :
- OcspClient — interroge les répondeurs OCSP (RFC 6960) depuis l'extension AIA du certificat
- CrlFetcher — télécharge les CRL depuis les points de distribution (RFC 5280)
- DSS — stocke les réponses OCSP et CRL dans le Document Security Store
- VRI — données de validation par signature (optionnel, selon recommandation ETSI)
B-LTA ajoute également un horodatage de document, activant la boucle d'archivage — le document peut être ré-horodaté pour étendre la validité indéfiniment.
Apparence de signature
Par défaut, les signatures sont invisibles. Pour créer un widget de signature visible :
use Yeeefang\TcpdfNext\Security\Signature\SignatureAppearance;
$pdf = Document::create()
->setSignature($cert, SignatureLevel::PAdES_B_T, $tsa)
->setSignatureAppearance(
SignatureAppearance::visible(x: 20, y: 250, w: 80, h: 30)
)
->addPage()
->cell(0, 10, 'Document avec signature visible')
->save('visible-signature.pdf');Pour une signature explicitement invisible :
$pdf->setSignatureAppearance(SignatureAppearance::invisible());Algorithmes et référence de méthode
Algorithmes de signature via phpseclib3 : RSA PKCS#1 v1.5 (par défaut, compatibilité maximale) et RSASSA-PSS (padding renforcé, recommandé pour nouveaux déploiements).
$pdf->setSignature(
CertificateInfo $cert, // Certificat et clé privée
SignatureLevel $level, // B-B, B-T, B-LT ou B-LTA
?TsaClient $tsa = null, // Requis pour B-T, B-LT, B-LTA
);Retourne static pour le chaînage. La signature est appliquée durant save() ou output().