Autorité d'horodatage (TSA)
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
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 :
$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 :
- MessageImprint -- Digest SHA-256 des données à horodater.
- Nonce -- Valeur 64-bit cryptographiquement aléatoire pour empêcher les attaques par rejeu.
- CertReq -- Défini sur
truepour que la TSA inclue son certificat de signature dans la réponse.
// 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 :
- Analyse le
TSTInfode la réponse. - Extrait le nonce du
TSTInfo. - Le compare au nonce envoyé dans la requête.
- Lance
TsaNonceMismatchExceptions'ils diffèrent.
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 :
| Code | Signification | Comportement du client |
|---|---|---|
0 | granted | Token accepté |
1 | grantedWithMods | Token accepté avec avertissement journalisé |
2 | rejection | TsaRejectedException lancée |
3 | waiting | Non supporté ; exception lancée |
4 | revocationWarning | Token accepté avec avertissement journalisé |
5 | revocationNotification | TsaCertRevokedException 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 :
$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 :
$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).
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) <-- DocumentTimestampServeurs TSA populaires
| Fournisseur | URL | Auth | Notes |
|---|---|---|---|
| FreeTSA | https://freetsa.org/tsr | Aucune | Gratuit ; adapté aux tests |
| Sectigo | https://timestamp.sectigo.com | Aucune | Qualité production ; niveau gratuit |
| DigiCert | https://timestamp.digicert.com | Aucune | Largement approuvé |
| GlobalSign | https://timestamp.globalsign.com/tsa/r6advanced1 | Aucune | SHA-256 par défaut |
| Custom / Entreprise | Varie | Basic, mTLS, Bearer | Utiliser 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.