Skip to content

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 / EnumObjectif
CertificateInfoCharger les certificats de signature (PEM ou PKCS#12)
SignatureLevelEnum: PAdES_B_B, PAdES_B_T, PAdES_B_LT, PAdES_B_LTA
TsaClientClient d'autorité d'horodatage RFC 3161
SignatureAppearanceWidget de signature visible ou invisible
OcspClientVérification de révocation en ligne RFC 6960
CrlFetcherRécupération de point de distribution CRL RFC 5280

Niveaux de signature

NiveauCe qu'il inclutValidité
B-B (Basique)Signature + certificat de signatureValide tant que le certificat n'est pas révoqué
B-T (Horodatage)B-B + horodatage RFC 3161Prouve que la signature existait avant un point dans le temps
B-LT (Long terme)B-T + DSS avec réponses OCSP/CRLVérifiable après expiration du certificat
B-LTA (Archivage)B-LT + horodatage document + boucle d'archivageVérifiable indéfiniment

Cycle de vie de signature PAdES

mermaid
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

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

php
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;

$cert = CertificateInfo::fromPkcs12(
    p12Path: '/path/to/certificate.p12',
    password: 'pkcs12-password',
);

Exemples de signature

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

php
$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 :

php
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 :

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

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

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