Pour qu'un PDF signé reste vérifiable dans plusieurs années, après l'expiration du certificat de signature et le renouvellement de son autorité de certification (CA), le composant PDFium peut générer des signatures PAdES à long terme sur Windows : un horodatage RFC 3161 pour une heure de confiance, une banque de sécurité de document (Document Security Store ou DSS) intégrant les éléments de validation, et un horodatage d'archive DocTimeStamp couvrant l'intégralité du fichier. Ces trois ajouts correspondent aux niveaux de référence PAdES B-T, B-LT et B-LTA, et le composant PDFium les implémente tous à partir d'un unique appel de signature. Cette fonctionnalité est disponible uniquement sur Windows, sous réserve de la valeur de PadesCryptoAvailable
Cet article est le troisième d'une série. Le premier, sur la signature de PDF avec PAdES B-B en utilisant PDFium VCL, traite de la signature de base ; le deuxième, sur l'inspection des signatures numériques PDF et des niveaux PAdES, traite de la lecture d'une signature et de la détection du niveau atteint. Ici, l'objectif est l'archivage : des signatures qui doivent survivre à l'expiration du certificat et rester vérifiables sur une période de conservation mesurée en années et non en semaines
Pourquoi une signature PDF valide cesse-t-elle d'être vérifiée avec le temps ?
Une signature de base répond à une unique question : ces octets ont-ils été modifiés après la signature. Elle ne prouve pas, à elle seule, le moment où la signature a eu lieu, et ce manque est ce qui l'invalide plus tard. La structure CMS contient un attribut d'heure de signature, mais le signataire écrit cette valeur depuis sa propre horloge, de sorte qu'un validateur n'a aucune raison de s'y fier. Lorsque le certificat de signature expire ultérieurement ou que la CA le révoque, un validateur strict ne peut plus distinguer une signature apposée pendant que le certificat était valide d'une signature contrefaite après son expiration. La signature était valable le jour de sa création et devient invérifiable sans que le signataire en soit responsable
L'archivage à long terme résout ce problème en deux étapes. Premièrement, un tiers de confiance, une autorité d'horodatage (TSA), atteste l'heure de manière cryptographique pour qu'elle ne dépende plus de la bonne foi du signataire. Deuxièmement, chaque certificat, réponse de révocation et CRL nécessaire pour construire et vérifier la chaîne de confiance est intégré au sein du PDF lui-même, afin que la validation ne dépende pas de serveurs qui pourraient avoir disparu au moment de la vérification. PAdES, normalisé sous la norme ETSI EN 319 142-1, organise ces éléments sous forme de niveaux de référence, et le composant PDFium écrit les structures requises pour chaque niveau
Qu'est-ce qu'une signature PDF LTV ou avec horodatage d'archive ?
PAdES définit quatre niveaux de référence qui s'appuient les uns sur les autres, et le composant PDFium les expose via l'énumération TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). B-B is la signature brute. B-T ajoute un horodatage de confiance sur la valeur de la signature. B-LT (long-term) intègre les éléments de validation, la propriété que la plupart des utilisateurs associent au terme "LTV". B-LTA (long-term avec horodatage d'archive) enveloppe le tout dans un horodatage supplémentaire qui couvre l'intégralité du fichier, de sorte que les éléments intégrés eux-mêmes soient provablement intacts depuis l'instant de l'archivage
L'analyse pratique s'apparente à un escalier. B-T prouve quand. B-LT prouve avec quoi la signature peut toujours être vérifiée. B-LTA prouve que l'ensemble du document n'a pas été altéré depuis son scellement, et c'est ce niveau que vous renouvelez, en ajoutant un nouveau DocTimeStamp avant l'expiration du précédent, afin de prolonger l'archivage indéfiniment. Pour un contrat ou un registre de conformité soumis à une longue obligation de conservation, le B-LTA est la cible ; le B-LT constitue le niveau minimal pragmatique
Ajouter une heure de confiance : PAdES B-T avec RFC 3161
Le composant PDFium convertit une signature B-B en B-T en définissant deux champs dans TPadesSignOptions : passer Level à plB_T et fournir un TsaUrl. Lorsque ces deux éléments sont présents, the pipeline de signature hache les octets bruts de la signature en SHA-256, encapsule ce condensé (digest) sous forme de messageImprint RFC 3161, envoie la requête HTTP POST à la TSA via WinHttp, et intègre le jeton renvoyé comme attribut non signé signature-time-stamp (OID 1.2.840.113549.1.9.16.2.14) dans le bloc unsignedAttrs [1] du SignerInfo, conformément à la norme EN 319 142-1 §6.3. L'horodatage couvre spécifiquement la valeur de la signature, ce qui lie l'heure de confiance à cette signature précise
var
Pdf: TPdf;
Options: TPadesSignOptions;
begin
Pdf := TPdf.Create(nil);
try
if not Pdf.PadesCryptoAvailable then
raise Exception.Create('PAdES signing backend is Windows-only');
Pdf.FileName := 'contract.pdf';
Pdf.Active := True;
Options := TPadesSignOptions.Default;
Options.CertificateThumbprint := 'A1B2C3D4E5F6071829304152637485960A1B2C3D';
Options.Level := plB_T;
Options.TsaUrl := 'http://timestamp.example-tsa.com/tsr';
Options.Reason := 'Contract execution';
// Nonce left at 0: the component derives a unique anti-replay value.
Pdf.SignPades('contract-bt.pdf', Options);
finally
Pdf.Free;
end;
end;
Intégrer les éléments de validation : B-LT et B-LTA en un seul appel
Le passage à la validation à long terme ne demande qu'une modification : configurer Level sur plB_LTA et conserver le TsaUrl. Le composant PDFium déroule alors l'ensemble du processus au sein d'un unique appel à SignPades. Il signe en B-B, horodate pour le B-T, injecte la banque de sécurité de document (Document Security Store) pour le B-LT, et ajoute l'horodatage d'archive pour le B-LTA, chaque étape constituant sa propre mise à jour incrémentielle pour que les octets précédents restent intacts
var
Pdf: TPdf;
Options: TPadesSignOptions;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'contract.pdf';
Pdf.Active := True;
Options := TPadesSignOptions.Default;
Options.CertificateThumbprint := 'A1B2C3D4E5F6071829304152637485960A1B2C3D';
Options.Level := plB_LTA; // drives B-B -> B-T -> B-LT -> B-LTA
Options.TsaUrl := 'http://timestamp.example-tsa.com/tsr';
Options.Location := 'Head Office';
// One call writes the timestamp, the DSS and the archive DocTimeStamp.
Pdf.SignPades('contract-lta.pdf', Options);
finally
Pdf.Free;
end;
end;
Pour l'étape B-LT, le composant PDFium construit la chaîne de certificats via CertGetCertificateChain et écrit un dictionnaire /DSS contenant le certificat du signataire ainsi que chaque autorité de certification intermédiaire dans un tableau /Certs (avec des tableaux /OCSPs et /CRLs associés), accompagné d'un marqueur /Extensions /ESIC de niveau 1, exactement comme le prescrit la norme EN 319 142-1 §5.4.2. Le certificat racine auto-signé est délibérément omis, puisque la RFC 5652 §10.2.3 l'autorise et que la racine constitue déjà une ancre de confiance détenue par le validateur. Le résultat est une signature qu'un lecteur peut vérifier en disposant uniquement du fichier
Pour le niveau B-LTA, le composant ajoute un horodatage de document (Document Time-stamp) : un dictionnaire de signature avec /SubFilter /ETSI.RFC3161 dont le /ByteRange couvre l'intégralité du fichier, son entrée /Contents contenant un jeton RFC 3161 sur cette plage, et il promeut le marqueur ESIC au niveau 2. C'est l'étape d'archivage du paragraphe §5.4.3 et du document TS 119 142-3. L'horodatage DocTimeStamp couvrant le DSS ainsi que la signature, il prouve que les éléments de validation intégrés étaient présents et inchangés à l'instant de l'archivage, ce qu'une politique de conservation à long terme doit précisément pouvoir démontrer
Compléter une signature déjà existante
Il arrive que la signature soit déjà présente sur le document et que vous ayez seulement besoin d'ajouter ou d'actualiser la banque de validation, par exemple pour élever une signature B-B tierce au niveau B-LT pour votre archivage. Le composant PDFium expose l'injecteur DSS directement via SaveAsPadesDss, qui ajoute les structures /DSS et /Extensions sous forme de mise à jour incrémentielle sans modifier les octets de la signature existante
var
Pdf: TPdf;
DssOpts: TPadesDssOptions;
Cert: TPadesDssMaterial;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'already-signed.pdf';
Pdf.Active := True;
DssOpts := TPadesDssOptions.Default;
DssOpts.EsicExtensionLevel := 1; // 1 for B-LT, 2 for B-LTA
Cert.DerBytes := LoadSignerCertDer; // your DER-encoded certificate
SetLength(DssOpts.Certs, 1);
DssOpts.Certs[0] := Cert;
Pdf.SaveAsPadesDss('already-signed-lt.pdf', DssOpts);
finally
Pdf.Free;
end;
end;
Vous fournissez les certificats encodés en DER, et éventuellement les réponses OCSP et les CRL dont un validateur aura besoin. Définissez EsicExtensionLevel sur 1 pour une banque B-LT ou sur 2 lorsqu'un DocTimeStamp suivra. Conservez IncludeVri à sa valeur par défaut False : la norme EN 319 142-1 §5.4.2.3 considère le dictionnaire /VRI par signature comme facultatif et le déconseille à moins qu'un lecteur spécifique ciblé ne l'exige
Coûts et limites à anticiper
Trois limites concrètes caractérisent ces différents niveaux. Premièrement, le moteur cryptographique est disponible uniquement sous Windows : la signature et l'horodatage s'appuient sur les couches système CNG et WinHttp, ainsi PadesCryptoAvailable renvoie False sur les autres plateformes et SignPades lève une exception. L'inspection en lecture seule traitée dans l'article connexe reste multiplateforme ; seule l'écriture des signatures est réservée à Windows. Deuxièmement, les niveaux B-T et B-LTA dépendent d'une autorité d'horodatage, ce qui implique un appel réseau lors de la signature et lie votre processus à la disponibilité et aux limites de débit d'un service externe
Troisièmement, chaque niveau a un coût en termes de stockage. Chaque étape ajoute une mise à jour incrémentielle plutôt que de réécrire le fichier, le DSS intègre une chaîne de certificats complète, et l'horodatage d'archive DocTimeStamp réserve de l'espace pour son jeton, de sorte qu'un fichier B-LTA est significativement plus volumineux que le document B-B d'origine. C'est un compromis délibéré : vous consommez des octets aujourd'hui pour garantir la vérifiabilité demain. Pour la plupart des archives de contrats et de conformité, c'est le bon choix, mais il convient de le mesurer sur vos propres documents plutôt que de faire des suppositions. Lorsque vous devez confirmer qu'un fichier finalisé a bien atteint le niveau requis, vérifiez-le à l'aide des techniques d'inspection des signatures numériques PDF et des niveaux PAdES, et si vous sécurisez plus largement un flux de documents, les notes sur l'audit des risques de sécurité PDF détaillent les contrôles associés
Les fonctionnalités de signature PAdES, de DSS et d'horodatage d'archive présentées ici font partie du composant PDFium pour Delphi et C++Builder, dont la page produit détaille l'intégralité des spécifications de signature et les exigences système