Kako bi se potpisani PDF mogao provjeriti godinama od danas, nakon što certifikat za potpisivanje istekne i njegov CA se promijeni, PDFium komponenta može proizvesti dugoročne PAdES potpise na Windowsima: vremenski žig RFC 3161 za pouzdano vrijeme, Document Security Store (DSS) koji ugrađuje materijal za provjeru i arhivski DocTimeStamp preko cijele datoteke. Ta tri dodatka čine PAdES osnovne razine B-T, B-LT i B-LTA, a PDFium komponenta doseže sve njih iz jednog poziva za potpisivanje. Ovo je značajka dostupna samo na Windowsima, zaštićena s PadesCryptoAvailable
Ovaj je članak treći u nizu. Prvi, o potpisivanju PDF-ova s PAdES B-B pomoću PDFium VCL-a, pokriva osnovni potpis; drugi, o provjeri PDF digitalnih potpisa i PAdES razina, pokriva čitanje potpisa i utvrđivanje razine koju je dosegao. Ovdje je fokus na arhivu: potpisima koji moraju preživjeti istek certifikata i ostati provjerljivi tijekom razdoblja čuvanja koje se mjeri godinama, a ne tjednima
Zašto valjani PDF potpis s vremenom prestaje vrijediti?
Osnovni potpis odgovara samo na jedno pitanje: jesu li ovi bajtovi izmijenjeni nakon potpisivanja. On sam po sebi ne dokazuje kada se potpisivanje dogodilo, i taj nedostatak je ono što ga kasnije kvari. CMS struktura nosi atribut vremena potpisivanja, ali potpisnik upisuje tu vrijednost sa svog sata, pa provjeritelj nema razloga vjerovati joj. Kada certifikat za potpisivanje kasnije istekne ili ga CA opozove, strogi provjeritelj više ne može razlikovati potpis stvoren dok je certifikat bio valjan od onoga krivotvorenog nakon što je istekao. Potpis je bio u okru na dan stvaranja, a postaje neprovjerljiv bez vlastite krivnje
Dugoročno arhiviranje rješava ovaj problem u dva koraka. Prvo, pouzdana treća strana, tijelo za vremensko žigosanje (Time Stamping Authority - TSA), kriptografski potvrđuje vrijeme tako da ono više ne ovisi o poštenju potpisnika. Drugo, svaki certifikat, odgovor o opozivu i CRL potreban za izgradnju i provjeru lanca povjerenja ugrađeni su u sam PDF, tako da provjera ne ovisi o poslužiteljima koji mogu nestati do trenutka provjere. PAdES, standardiziran kao ETSI EN 319 142-1, slaže ih kao osnovne razine, a PDFium komponenta zapisuje strukture koje svaka razina zahtijeva
Što je LTV ili arhivski vremenski žigosan PDF potpis?
PAdES definira četiri osnovne razine koje se nadograđuju jedna na drugu, a PDFium komponenta ih izlaže kroz nabrajanje TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). B-B je običan potpis. B-T dodaje pouzdani vremenski žig preko vrijednosti potpisa. B-LT (long-term) dodaje ugrađeni materijal za provjeru, što je svojstvo na koje većina ljudi misli pod pojmom "LTV". B-LTA (long-term s arhivskim vremenskim žigom) omotava sve u još jedan vremenski žig koji pokriva cijelu datoteku, tako da je ugrađeni materijal dokazivo netaknut od trenutka arhiviranja
Praktično tumačenje je poput stepenica. B-T dokazuje kada. B-LT dokazuje čime se potpis i dalje može provjeriti. B-LTA dokazuje da cijeli paket nije mijenjan otkako je zapečaćen, i to je razina koju obnavljate dodavanjem novog DocTimeStamp vremenskog žiga prije nego što prethodni istekne, kako biste produžili arhivu unedogled. Za ugovor ili zapis o sukladnosti s dugom obvezom čuvanja, B-LTA je cilj; B-LT je pragmatični minimum
Dodavanje pouzdanog vremena: PAdES B-T s RFC 3161
PDFium komponenta pretvara B-B potpis u B-T postavljanjem dvaju polja na TPadesSignOptions: podignite Level na plB_T i navedite TsaUrl. Kada su oba prisutna, cjevovod za potpisivanje sažima (hash) sirove oktete potpisa pomoću SHA-256, pakira taj sažetak kao RFC 3161 messageImprint, šalje POST zahtjev TSA-u preko WinHttp-a i ugrađuje vraćeni token kao nepotpisani atribut signature-time-stamp (OID 1.2.840.113549.1.9.16.2.14) u SignerInfo unsignedAttrs [1], prema EN 319 142-1 §6.3. Vremenski žig pokriva specifično vrijednost potpisa, što povezuje pouzdano vrijeme s tim konkretnim potpisom
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;
CertificateThumbprint je SHA-1 otisak (hash), u heksadecimalnom obliku, certifikata u spremištu Current User "MY" čiji privatni ključ možete koristiti. Polje Nonce je RFC 3161 vrijednost protiv ponavljanja (anti-replay); ostavite je na nuli i komponenta će izvesti jedinstvenu vrijednost po zahtjevu iz SHA-256 preklapanja brojača, sata, broja otkucaja i ID-ja procesa, tako da se dva zahtjeva izdana u istoj milisekundi ne sudare. Prosljeđujte vlastitu vrijednost samo ako imate kriptografski RNG kojem radije vjerujete. Jedno iskreno upozorenje: B-T ovisi o dostupnosti i latenciji TSA-a
Ugrađivanje materijala za provjeru: B-LT i B-LTA u jednom pozivu
Korak prema dugoročnoj provjeri je jednostavan: postavite Level na plB_LTA i zadržite TsaUrl. PDFium komponenta tada pokreće cijeli niz unutar jednog poziva SignPades. Potpisuje B-B, vremenski žigosati za B-T, ubacuje Document Security Store za B-LT i dodaje arhivski vremenski žig za B-LTA, svaki kao vlastito inkrementalno ažuriranje tako da raniji bajtovi ostanu netaknuti bajt po bajt
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;
Za fazu B-LT, PDFium komponenta gradi lanac certifikata pomoću CertGetCertificateChain i zapisuje rječnik /DSS koji prenosi certifikat potpisnika plus svaki posrednički CA u polju /Certs (s paralelnim poljima /OCSPs and /CRLs), uz marker /Extensions /ESIC na razini 1, točno onako kako propisuje EN 319 142-1 §5.4.2. Samopotpisani korijenski certifikat namjerno je izostavljen, budući da ga RFC 5652 §10.2.3 dopušta, a korijen je već sidro povjerenja koje provjeritelj posjeduje. Rezultat je potpis koji čitatelj može provjeriti samo s datotekom u ruci
Za B-LTA, komponenta dodaje Document Time-stamp: rječnik potpisa s /SubFilter /ETSI.RFC3161 čiji /ByteRange obuhvaća cijelu datoteku, a njegov /Contents sadrži RFC 3161 token preko tog raspona, te promiče ESIC marker na razinu 2. To je arhivski korak prema §5.4.3 i TS 119 142-3. Budući da DocTimeStamp pokriva DSS kao i potpis, on dokazuje da je ugrađeni materijal za provjeru bio prisutan i nepromijenjen u trenutku arhiviranja, što je točno ono što dugoročna pravila čuvanja moraju moći prikazati
Nadogradnja postojećeg potpisa
Ponekad je potpis već na dokumentu i trebate samo dodati ili osvježiti spremište za provjeru, na primjer kako biste prenijeli B-B potpis treće strane na razinu B-LT za svoju arhivu. PDFium komponenta izlaže DSS injektor izravno kroz SaveAsPadesDss, koji dodaje strukture /DSS i /Extensions kao inkrementalno ažuriranje bez diranja postojećih bajtova potpisa
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;
Dostavljate DER-kodirane certifikate, te opcionalno OCSP odgovore i CRL-ove, koje će provjeritelj trebati. Postavite EsicExtensionLevel na 1 za B-LT spremište ili 2 kada će uslijediti DocTimeStamp. Ostavite IncludeVri na zadanoj vrijednosti False: EN 319 142-1 §5.4.2.3 tretira rječnik /VRI po potpisu kao opcionalan i savjetuje protiv njega, osim ako ga određeni čitač koji ciljate izričito ne zahtijeva
Troškovi i granice koje vrijedi planirati
Tri stvarna ograničenja oblikuju mjesto gdje se ove razine uklapaju. Prvo, kriptografska pozadina (backend) dostupna je samo na Windowsima: potpisivanje i vremensko žigosanje prolaze kroz platformu CNG i WinHttp spremišta, pa PadesCryptoAvailable drugdje vraća False, a SignPades podiže iznimku. Provjera s čitanjem pokrivena u popratnom članku ostaje višeplatformska; samo je pisanje potpisa vezano za Windowse. Drugo, B-T i B-LTA ovise o tijelu za vremensko žigosanje (TSA), što znači mrežni poziv u trenutku potpisivanja i vanjsku uslugu čija dostupnost i ograničenja propusnosti postaju dio vaše putanje potpisivanja
Treće, svaka razina košta prostor za pohranu. Svaka faza dodaje inkrementalno ažuriranje umjesto ponovnog pisanja datoteke, DSS ugrađuje puni lanac certifikata, a arhivski DocTimeStamp rezervira prostor za svoj token, pa je B-LTA datoteka znatno veća od izvornika B-B. To je svjestan kompromis: trošite bajtove sada kako biste kupili provjerljivost kasnije. Za većinu arhiva ugovora i sukladnosti to je ispravan kompromis, ali ga vrijedi izmjeriti na vlastitim dokumentima umjesto pretpostavljanja. Kada trebate potvrditi da je gotova datoteka stvarno dosegla razinu koju ste namjeravali, provjerite je pomoću tehnika iz članka o provjeri PDF digitalnih potpisa i PAdES razina, a ako šire osiguravate cjevovod dokumenata, bilješke o reviziji sigurnosnih rizika PDF-a pokrivaju prateće provjere
Značajke PAdES potpisivanja, DSS-a i arhivskog vremenskog žigosanja prikazane ovdje dio su komponente PDFium Component za Delphi i C++Builder, čija stranica proizvoda sadrži potpunu referencu za potpisivanje i zahtjeve platforme