Aby bolo možné podpísané PDF overiť aj po rokoch, keď vyprší platnosť podpisového certifikátu a zmení sa certifikačná autorita (CA), komponent PDFium Component dokáže v systéme Windows vytvárať dlhodobé podpisy PAdES: časovú pečiatku RFC 3161 pre dôveryhodný čas, úložisko zabezpečenia dokumentu (Document Security Store — DSS), ktoré integruje validačné materiály, a archívnu časovú pečiatku dokumentu (DocTimeStamp) nad celým súborom. Tieto tri doplnky predstavujú základné úrovne PAdES B-T, B-LT a B-LTA a komponent PDFium Component ich všetky dosahuje z jediného volania podpísania. Táto schopnosť je dostupná len pre Windows a je podmienená vlastnosťou PadesCryptoAvailable
Tento článok je tretím v sérii. Prvý článok o podpisovaní PDF pomocou PAdES B-B s PDFium VCL sa zaoberá základným podpisom; druhý o kontrole digitálnych podpisov PDF a úrovní PAdES pokrýva spätné čítanie podpisu a určenie dosiahnutej úrovne. V tomto článku sa zameriame na archív: podpisy, ktoré musia prežiť vypršanie platnosti certifikátu a zostať overiteľné po dobu uchovávania meranú v rokoch a nie týždňoch
Prečo sa platný PDF podpis časom prestane overovať?
Základný podpis odpovedá iba na jednu otázku: či sa tieto bajty po podpísaní zmenili. Sám o sebe však nedokazuje, kedy k podpisu došlo, a táto medzera ho neskôr zneplatní. Štruktúra CMS nesie atribút času podpísania, ale podpisovateľ zapisuje túto hodnotu zo svojich vlastných hodín, takže validátor nemá dôvod jej dôverovať. Keď podpisovému certifikátu neskôr vyprší platnosť alebo ho CA odvolá, prísny validátor už nedokáže rozlíšiť podpis vytvorený v čase platnosti certifikátu od podpisu sfalšovaného po jej skončení. Podpis bol v deň svojho vytvorenia v poriadku a stáva sa neoveriteľným bez vlastného zavinenia
Dlhodobá archivácia to rieši dvoma krokmi. Po prvé, dôveryhodná tretia strana, autorita časových pečiatok (Time Stamping Authority — TSA), potvrdzuje čas kryptograficky, takže už nezávisí od čestnosti podpisovateľa. Po druhé, každý certifikát, odpoveď na odvolanie a zoznam CRL potrebné na zostavenie a kontrolu reťazca dôvery sú vložené priamo do samotného PDF, takže overenie nezávisí od serverov, ktoré už v čase kontroly nemusia existovať. Profil PAdES, štandardizovaný ako ETSI EN 319 142-1, vrství ako základné úrovne a komponent PDFium Component zapisuje štruktúry, ktoré každá úroveň vyžaduje
Čo je to LTV alebo archívna časová pečiatka PDF podpisu?
PAdES definuje štyri základné úrovne, ktoré stavajú na sebe, a komponent PDFium Component ich sprístupňuje prostredníctvom enumu TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). B-B je obyčajný podpis. B-T pridáva dôveryhodnú časovú pečiatku nad hodnotu podpisu. B-LT (long-term) pridáva vložené validačné materiály, čo je vlastnosť, ktorú väčšina ľudí označuje ako „LTV“. B-LTA (long-term s archívnou časovou pečiatkou) obaľuje všetko do ešte jednej časovej pečiatky, ktorá pokrýva celý súbor, takže samotný vložený materiál je preukázateľne neporušený od okamihu archivácie
V praxi ide o schodisko. B-T dokazuje kedy. B-LT dokazuje, pomocou čoho sa dá podpis stále overiť. B-LTA dokazuje, že s celým balíkom sa po zapečatení nemanipulovalo, a je to úroveň, ktorú obnovujete pridaním novej časovej pečiatky DocTimeStamp predtým, než vyprší tá predchádzajúca, čím archív predlžujete na neurčito. Pre zmluvy alebo záznamy o zhode s dlhou povinnosťou uchovávania je cieľom B-LTA; B-LT je pragmatické minimum
Pridanie dôveryhodného času: PAdES B-T s RFC 3161
Komponent PDFium Component mení podpis B-B na B-T nastavením dvoch polí v TPadesSignOptions: zvýšením vlastnosti Level na plB_T a zadaním TsaUrl. Keď sú prítomné obe hodnoty, podpisovacia pipeline zahašuje surové bajty podpisu pomocou SHA-256, zabalí tento odtlačok ako RFC 3161 messageImprint, odošle požiadavku POST na server TSA cez rozhranie WinHttp a vloží vrátený token ako nepodpísaný atribút signature-time-stamp (OID 1.2.840.113549.1.9.16.2.14) v sekcii unsignedAttrs [1] štruktúry SignerInfo, v súlade s normou EN 319 142-1 §6.3. Časová pečiatka pokrýva konkrétne hodnotu podpisu, čo spája dôveryhodný čas s týmto presným podpisom
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;
Vlastnosť CertificateThumbprint je odtlačok SHA-1 v hexadecimálnom formáte certifikátu v úložisku aktuálneho používateľa „MY“, ktorého súkromný kľúč môžete použiť. Pole Nonce je hodnota ochrany proti opakovanému použitiu (anti-replay) podľa RFC 3161. Nechajte ju na nule a komponent odvodí jedinečnú hodnotu pre každú požiadavku zo SHA-256 zloženia počítadla, hodín, systémového času a ID procesu, takže dve požiadavky odoslané v rovnakej milisekunde nekolidujú. Vlastnú hodnotu odovzdajte len vtedy, ak máte kryptografický generátor náhodných čísel, ktorému chcete dôverovať. Jedno úprimné varovanie: B-T vyžaduje dostupnú autoritu TSA, takže podpisovanie teraz vykonáva sieťové volanie a dedí dostupnosť a latenciu TSA
Vloženie validačného materiálu: B-LT a B-LTA v jednom volaní
Krok smerom k dlhodobému overeniu je jedinou zmenou: nastavte vlastnosť Level na plB_LTA a ponechajte TsaUrl. Komponent PDFium Component potom vykoná celý rebríček v rámci jedného volania SignPades. Podpíše B-B, opečiatkuje pre B-T, vloží Document Security Store pre B-LT a pripojí archívnu časovú pečiatku pre B-LTA, každú ako vlastnú prírastkovú aktualizáciu, takže predchádzajúce bajty zostávajú neporušené
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;
Pre fázu B-LT zostaví komponent PDFium Component reťazec certifikátov pomocou CertGetCertificateChain a zapíše slovník /DSS nesúci certifikát podpisovateľa plus každú sprostredkovateľskú autoritu CA v poli /Certs (s paralelnými poľami /OCSPs a /CRLs), spolu so značkou /Extensions /ESIC na úrovni 1, presne tak, ako to predpisuje norma EN 319 142-1 §5.4.2. Samopodpísaný koreňový certifikát je zámerne vynechaný, keďže RFC 5652 §10.2.3 dovoľuje a koreň je už kotvou dôvery, ktorú validátor vlastní. Výsledkom je podpis, ktorý môže čitateľ overiť iba so samotným súborom v ruke
Pre úroveň B-LTA komponent pripojí časovú pečiatku dokumentu (Document Time-stamp): slovník podpisu s /SubFilter /ETSI.RFC3161, ktorého /ByteRange pokrýva celý súbor, pričom jeho /Contents obsahuje token RFC 3161 nad týmto rozsahom, a povýši značku ESIC na úroveň 2. Toto je archívny krok podľa §5.4.3 a TS 119 142-3. Keďže časová pečiatka DocTimeStamp pokrýva DSS aj samotný podpis, dokazuje, že vložené validačné materiály boli v čase archivácie prítomné a nezmenené, čo je presne to, čo dlhodobá politika uchovávania musí vedieť preukázať
Doplnenie už existujúceho podpisu
Niekedy už podpis v dokumente existuje a vy potrebujete len pridať alebo aktualizovať validačné úložisko, napríklad na zvýšenie podpisu tretej strany z úrovne B-B na úroveň B-LT pre váš archív. Komponent PDFium Component vystavuje DSS injektor priamo cez metódu SaveAsPadesDss, ktorá pripojí štruktúry /DSS a /Extensions ako prírastkovú aktualizáciu bez toho, aby sa dotkla existujúcich bajtov podpisu
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;
Dodáte certifikáty kódované v DER a voliteľne odpovede OCSP a zoznamy CRL, ktoré bude validátor potrebovať. Nastavte EsicExtensionLevel na 1 pre úložisko B-LT alebo na 2, ak bude nasledovať DocTimeStamp. Ponechajte IncludeVri v jeho predvolenej hodnote False: norma EN 319 142-1 §5.4.2.3 považuje slovník /VRI pre každý podpis za voliteľný a odporúča ho nepoužívať, pokiaľ ho nevyžaduje konkrétna čítačka, na ktorú cielite
Náklady a obmedzenia, s ktorými treba počítať
Tieto úrovne formujú tri úprimné obmedzenia. Po prvé, kryptografický backend je určený len pre Windows: podpisovanie a pečiatkovanie prebiehajú cez platformové úložiská CNG a WinHttp, takže vlastnosť PadesCryptoAvailable vracia inde False a volanie SignPades vyvolá výnimku. Kontrola na strane čítania opísaná v sprievodnom článku zostáva multiplatformová; iba zápis podpisov je viazaný na Windows. Po druhé, úrovne B-T a B-LTA závisia od autority časových pečiatok (TSA), čo znamená sieťovú komunikáciu v čase podpísania a externú službu, ktorej dostupnosť a rýchlostné limity sa stávajú súčasťou vašej podpisovacej cesty
Po tretie, každá úroveň stojí diskovú kapacitu. Každá fáza pridáva prírastkovú aktualizáciu namiesto prepísania súboru, DSS vkladá plný reťazec certifikátov a archívna časová pečiatka DocTimeStamp vyhradzuje miesto pre svoj token, so súbor B-LTA je výrazne väčší ako originál B-B. Je to zámerný kompromis: miniete bajty teraz, aby ste si kúpili overiteľnosť neskôr. Pre väčšinu archívov zmlúv a súladu s predpismi je to správny kompromis, no oplatí sa ho zmerať na vlastných dokumentoch a nepredpokladať len tak. Keď potrebujete potvrdiť, že hotový súbor skutočne dosiahol úroveň, ktorú ste chceli, overte ho pomocou techník popísaných v článku o kontrole digitálnych podpisov PDF a úrovní PAdES. A ak širšie zabezpečujete dokumentové procesy, okolité kontroly nájdete v poznámkach o audite bezpečnostných rizík PDF
Funkcie podpisovania PAdES, DSS a archívnej časovej pečiatky zobrazené v tomto článku sú súčasťou komponentu PDFium Component pre Delphi a C++Builder, ktorého produktová stránka obsahuje kompletnú referenčnú príručku k podpisovaniu a požiadavky na platformu