Skip to content

Autorité d'horodatage (TSA)

Pro — Commercial License Required
L'intégration TSA RFC 3161 nécessite le package Pro.

TCPDF-Next Pro fournit un client RFC 3161 Timestamp Authority de qualité production (TsaClient) et un helper DocumentTimestamp qui intègre des signatures /DocTimeStamp pour les workflows PAdES B-LTA.

TsaClient

Utilisation basique

php
use Yeeefang\TcpdfNext\Pro\Tsa\TsaClient;

$tsa = new TsaClient(url: 'https://freetsa.org/tsr');

$token = $tsa->timestamp($pdfHash);

Avec authentification

Certains serveurs TSA corporatifs nécessitent des identifiants :

php
$tsa = new TsaClient(
    url:      'https://tsa.corporate.example/rfc3161',
    username: 'api-user',
    password: 'api-secret',
);

Construction de TimeStampReq RFC 3161

Le client construit une structure ASN.1 TimeStampReq conforme aux standards pour chaque requête :

  1. MessageImprint -- Digest SHA-256 des données à horodater.
  2. Nonce -- Valeur 64-bit cryptographiquement aléatoire pour empêcher les attaques par rejeu.
  3. CertReq -- Défini sur true pour que la TSA inclue son certificat de signature dans la réponse.
php
// Le hash doit être binaire brut (32 bytes pour SHA-256)
$hash = hash('sha256', $documentBytes, binary: true);

$token = $tsa->timestamp($hash, algorithm: 'sha256');

Vérification du nonce

Après réception du TimeStampResp, le client automatiquement :

  1. Analyse le TSTInfo de la réponse.
  2. Extrait le nonce du TSTInfo.
  3. Le compare au nonce envoyé dans la requête.
  4. Lance TsaNonceMismatchException s'ils diffèrent.
php
try {
    $token = $tsa->timestamp($hash);
} catch (\Yeeefang\TcpdfNext\Pro\Tsa\TsaNonceMismatchException $e) {
    // Nonce non concordant -- possible attaque MITM ou par rejeu
    log_security_event($e->getMessage());
}

Validation PKIStatus

Le client valide le champ PKIStatus dans chaque réponse :

CodeSignificationComportement du client
0grantedToken accepté
1grantedWithModsToken accepté avec avertissement journalisé
2rejectionTsaRejectedException lancée
3waitingNon supporté ; exception lancée
4revocationWarningToken accepté avec avertissement journalisé
5revocationNotificationTsaCertRevokedException lancée

Épinglage DNS (protection SSRF)

Pour empêcher Server-Side Request Forgery, vous pouvez épingler le nom d'hôte TSA à une adresse IP spécifique. Le client utilise CURLOPT_RESOLVE pour contourner complètement la résolution DNS :

php
$tsa = new TsaClient(
    url: 'https://tsa.corporate.example/rfc3161',
);

// Épingler le nom d'hôte à une IP connue -- DNS n'est jamais interrogé
$tsa->pinDns('tsa.corporate.example', '203.0.113.42', port: 443);

Ceci est critique dans les environnements où l'URL TSA provient d'entrée utilisateur ou de configuration externe et ne doit pas résoudre vers des adresses réseau internes.

mTLS (Mutual TLS)

Les serveurs TSA corporatifs nécessitent fréquemment une authentification par certificat client. Passez votre certificat client et clé privée :

php
$tsa = new TsaClient(
    url: 'https://tsa.bank.example/timestamp',
);

$tsa->clientCertificate(
    certPath: '/etc/pki/tsa-client.pem',
    keyPath:  '/etc/pki/tsa-client.key',
    keyPassword: 'client-key-pass',
);

Le handle cURL sous-jacent est configuré avec CURLOPT_SSLCERT, CURLOPT_SSLKEY et CURLOPT_SSLCERTPASSWD.

DocumentTimestamp (B-LTA)

DocumentTimestamp ajoute une signature /DocTimeStamp au PDF, qui est l'étape finale d'un workflow PAdES B-LTA. Cet horodatage couvre le document entier incluant toutes les signatures précédentes et le DSS (Document Security Store).

php
use Yeeefang\TcpdfNext\Pro\Tsa\DocumentTimestamp;
use Yeeefang\TcpdfNext\Pro\Tsa\TsaClient;

$tsa = new TsaClient(url: 'https://freetsa.org/tsr');

$stamper = new DocumentTimestamp(
    tsaClient: $tsa,
    hashAlgorithm: 'sha256',
);

// Appliquer l'horodatage de document (sauvegarde incrémentielle)
$stamper->apply($document);

Résumé du workflow B-LTA

1. Signer document          (PAdES B-B)
2. Ajouter horodatage signature (PAdES B-T)
3. Intégrer DSS (OCSP + CRL) (PAdES B-LT)
4. Ajouter /DocTimeStamp       (PAdES B-LTA)  <-- DocumentTimestamp

Serveurs TSA populaires

FournisseurURLAuthNotes
FreeTSAhttps://freetsa.org/tsrAucuneGratuit ; adapté aux tests
Sectigohttps://timestamp.sectigo.comAucuneQualité production ; niveau gratuit
DigiCerthttps://timestamp.digicert.comAucuneLargement approuvé
GlobalSignhttps://timestamp.globalsign.com/tsa/r6advanced1AucuneSHA-256 par défaut
Custom / EntrepriseVarieBasic, mTLS, BearerUtiliser pinDns() + clientCertificate()

TIP

Pour les documents PAdES B-LTA en production, utilisez un fournisseur TSA dont le certificat racine est dans l'Adobe Approved Trust List (AATL). Cela garantit que les horodatages sont reconnus par Adobe Acrobat sans configuration manuelle de confiance.

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