Pentru a ca un PDF semnat să poată fi validat peste ani, după ce certificatul de semnare expiră și autoritatea de certificare CA își schimbă cheile, componenta PDFium poate genera semnături PAdES pe termen lung pe Windows: un timestamp RFC 3161 pentru un timp de încredere, un depozit de securitate a documentului (Document Security Store) care include materialul de validare și un DocTimeStamp de arhivă peste întregul fișier. Aceste trei elemente reprezintă nivelurile de bază PAdES B-T, B-LT și B-LTA, iar componenta PDFium le poate realiza pe toate printr-un singur apel de semnare. Aceasta este o funcționalitate disponibilă doar pe Windows, controlată de PadesCryptoAvailable
Acest articol este al treilea dintr-o serie. Primul, semnarea PDF-urilor cu PAdES B-B folosind PDFium VCL, descrie semnătura de bază; al doilea, inspectarea semnăturilor digitale PDF și a nivelurilor PAdES, acoperă citirea unei semnături și identificarea nivelului atins. Aici ne concentrăm pe arhivă: semnături care trebuie să supraviețuiască expirării certificatului și să rămână verificabile pentru o perioadă de păstrare măsurată în ani, nu în săptămâni
De ce o semnătură PDF validă nu mai poate fi verificată în timp?
O semnătură de bază răspunde la o singură întrebare: au fost acești octeți modificați după semnare. Ea nu dovedește în sine când a avut loc semnarea, iar această lipsă este cea care o va invalida ulterior. Structura CMS conține un atribut pentru timpul semnării, dar semnatarul scrie această valoare folosind propriul ceas, astfel încât un validator nu are motive să o considere sigură. Când certificatul de semnare expiră ulterior sau autoritatea CA îl revocă, un validator strict nu mai poate distinge o semnătură realizată în perioada de valabilitate a certificatului de una falsificată după expirarea acestuia. Semnătura era corectă în ziua creării, dar devine neverificabilă fără nicio vină a sa
Arhivarea pe termen lung rezolvă această problemă în două moduri. În primul rând, o terță parte de încredere, o Autoritate de Marcare Temporală (TSA), confirmă criptografic ora, astfel încât aceasta nu mai depinde de ceasul semnatarului. În al doilea rând, fiecare certificat, răspuns de revocare și listă CRL necesară pentru construirea și verificarea lanțului de încredere este încorporat în interiorul PDF-ului, astfel încât validarea să nu depindă de servere care ar putea să nu mai funcționeze în momentul verificării. Standardul PAdES, reglementat ca ETSI EN 319 142-1, le organizează ca niveluri de bază, iar componenta PDFium scrie structurile pe care le solicită fiecare nivel
Ce este o semnătură PDF cu LTV sau timestamp de arhivă?
PAdES definește patru niveluri de bază care se completează reciproc, iar componenta PDFium le expune prin enumerarea TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). Nivelul B-B este semnătura simplă. Nivelul B-T adaugă un timestamp de încredere peste valoarea semnăturii. Nivelul B-LT (long-term) adaugă materialul de validare încorporat, caracteristică denumită de obicei „LTV”. Nivelul B-LTA (long-term cu timestamp de arhivă) include totul într-un timestamp suplimentar care acoperă întregul fișier, astfel încât materialul încorporat să fie garantat intact din momentul arhivării
În practică, este o structură ierarhică. Nivelul B-T dovedește când s-a semnat. Nivelul B-LT dovedește cu ce poate fi verificată în continuare semnătura. Nivelul B-LTA dovedește că întregul pachet nu a fost modificat de când a fost sigilat și este nivelul pe care îl reînnoiți prin adăugarea unui nou DocTimeStamp înainte ca cel anterior să expire, extinzând valabilitatea arhivei pe termen nelimitat. Pentru un contract sau o înregistrare de conformitate cu o obligație lungă de păstrare, B-LTA este ținta; B-LT este nivelul minim acceptabil
Adăugarea timpului de încredere: PAdES B-T cu RFC 3161
Componenta PDFium transformă o semnătură B-B în B-T prin configurarea a două câmpuri din TPadesSignOptions: setarea Level pe plB_T și furnizarea unei adrese TsaUrl. Când ambele sunt prezente, procesul de semnare generează hash-ul octeților semnăturii brute cu SHA-256, împachetează acel rezumat ca un messageImprint conform RFC 3161, trimite prin POST solicitarea către TSA prin WinHttp și include tokenul returnat ca atributul nesemnat signature-time-stamp (OID 1.2.840.113549.1.9.16.2.14) în unsignedAttrs [1] din SignerInfo, conform EN 319 142-1 §6.3. Marca temporală (timestamp-ul) acoperă în mod specific valoarea semnăturii, asociind ora de încredere cu acea semnătură exactă
uses
PDFium, FPdfPades;
procedure SignWithTimestamp;
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;
Încorporarea materialului de validare: B-LT și B-LTA într-un singur apel
Trecerea la validarea pe termen lung necesită o singură modificare: setarea Level pe plB_LTA și păstrarea adresei TsaUrl. Componenta PDFium rulează apoi toate etapele ierarhiei într-un singur apel SignPades. Semnează nivelul B-B, adaugă timestamp-ul pentru B-T, injectează Document Security Store pentru B-LT și adaugă timestamp-ul de arhivă pentru B-LTA, fiecare ca o salvare incrementală separată, astfel încât octeții anteriori să rămână intacți
procedure SignForArchive;
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;
Pentru etapa B-LT, componenta PDFium construiește lanțul de certificate cu CertGetCertificateChain și scrie un dicționar /DSS care conține certificatul semnatarului plus fiecare autoritate intermediară CA într-un tablou /Certs (cu tablouri paralele /OCSPs și /CRLs), alături de un marcator /Extensions /ESIC la Nivelul 1, exact așa cum prescrie standardul EN 319 142-1 §5.4.2. Certificatul rădăcină auto-semnat este omis în mod deliberat, deoarece RFC 5652 §10.2.3 permite acest lucru, iar rădăcina este deja o ancoră de încredere pe care o deține validatorul. Rezultatul este o semnătură pe care un cititor o poate verifica doar având la dispoziție fișierul
Pentru B-LTA, componenta adaugă un Document Time-stamp: un dicționar de semnătură cu /SubFilter /ETSI.RFC3161 ale cărui coordonate /ByteRange acoperă întregul fișier, intrarea sa /Contents stocând un token RFC 3161 peste acel interval, promovând marcatorul ESIC la Nivelul 2. Acesta este pasul de arhivare conform §5.4.3 și TS 119 142-3. Deoarece DocTimeStamp acoperă atât DSS-ul, cât și semnătura, dovedește că materialul de validare încorporat era prezent și nemodificat în momentul arhivării, ceea ce trebuie să demonstreze o politică lungă de păstrare
Completarea unei semnături existente
Uneori, semnătura există deja pe document și trebuie doar să adăugați sau să actualizați depozitul de validare, de exemplu pentru a aduce o semnătură B-B creată de terți la nivelul B-LT pentru arhivă. Componenta PDFium expune injectorul DSS direct prin SaveAsPadesDss, care adaugă structurile /DSS și /Extensions ca o salvare incrementală, fără a afecta octeții semnăturii existente
procedure AddValidationStore;
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;
Furnizați certificatele codificate DER și, opțional, răspunsurile OCSP și listele CRL de care va avea nevoie validatorul. Setați EsicExtensionLevel pe 1 pentru un depozit B-LT sau pe 2 când urmează un DocTimeStamp. Lăsați IncludeVri pe valoarea implicită False: standardul EN 319 142-1 §5.4.2.3 tratează dicționarul /VRI per-semnătură ca fiind opțional și recomandă evitarea lui, cu excepția cazului în care un cititor specific vizat îl solicită
Costuri și limite de luat în considerare
Trei limite reale definesc aplicabilitatea acestor niveluri. În primul rând, backend-ul criptografic este disponibil doar pe Windows: semnarea și aplicarea mărcii temporale trec prin funcțiile CNG ale platformei și depozitele WinHttp, astfel încât PadesCryptoAvailable returnează False pe alte sisteme, iar SignPades generează o excepție. Inspecția semnăturilor, descrisă în articolul însoțitor, rămâne multiplatformă; doar scrierea semnăturilor este legată de Windows. În al doilea rând, nivelurile B-T și B-LTA depind de o Autoritate de Marcare Temporală, ceea ce implică un timp suplimentar de rețea la momentul semnării și o dependență de disponibilitatea și limitele de trafic ale unui serviciu extern
În al treilea rând, fiecare nivel aduce un cost de stocare. Fiecare etapă adaugă o salvare incrementală în loc să rescrie fișierul, structura DSS include un lanț complet de certificate, iar elementul DocTimeStamp de arhivă rezervă spațiu pentru tokenul său, astfel încât un fișier B-LTA este vizibil mai mare decât originalul B-B. Acesta este compromisul asumat: consumați mai mulți octeți acum pentru a obține capacitate de verificare pe termen lung. Pentru majoritatea arhivelor de contracte și conformitate, este alegerea corectă, dar merită măsurată pe propriile documente. Când doriți să confirmați că un fișier finalizat a atins nivelul dorit, verificați-l folosind tehnicile din inspectarea semnăturilor digitale PDF și a nivelurilor PAdES, iar dacă doriți să securizați mai larg fluxul de documente, notele despre analiza riscurilor de securitate PDF acoperă aceste verificări
Funcționalitățile de semnare PAdES, structura DSS și timestamp-ul de arhivă prezentate aici fac parte din pachetul PDFium Component pentru Delphi și C++Builder, a cărui pagină de produs conține documentația completă de semnare și cerințele de sistem