Tehnički članak

Dugoročni PDF potpisi u Delphi-ju: PAdES B-LT i B-LTA

Da bi se potpisan PDF mogao verifikovati godinama od danas, nakon što sertifikat o potpisivanju istekne a njegov CA se promeni, PDFium komponenta može proizvesti dugoročne PAdES potpise na sistemu Windows: RFC 3161 vremenski žig za verifikovano vreme, Document Security Store (DSS) koji ugrađuje materijale za validaciju, i arhivski DocTimeStamp preko cele datoteke. Ta tri dodatka čine osnovne PAdES nivoe B-T, B-LT i B-LTA, a PDFium komponenta ih sve postiže iz jednog poziva za potpisivanje. Ovo je funkcija dostupna samo na Windows-u, zaštićena proverom PadesCryptoAvailable

Ovaj članak je treći u seriji. Prvi, o potpisivanju PDF-ova pomoću PAdES B-B koristeći PDFium VCL, pokriva osnovni potpis; drugi, o inspekciji digitalnih PDF potpisa i PAdES nivoa, pokriva ponovno čitanje potpisa i prepoznavanje dostignutog nivoa. Ovde je tema arhiviranje: potpisi koji moraju preživeti istek sertifikata i ostati verifikovani tokom perioda čuvanja koji se meri godinama, a ne nedeljama

Zašto ispravan PDF potpis prestaje da važi tokom vremena?

Osnovni potpis odgovara na samo jedno pitanje: da li su ovi bajtovi izmenjeni nakon potpisivanja. On sam po sebi ne dokazuje kada se potpisivanje desilo, i taj nedostatak je ono što ga kasnije kvari. CMS struktura nosi atribut vremena potpisivanja, ali potpisnik upisuje tu vrednost sa sopstvenog sata, pa validator nema razloga da joj veruje. Kada sertifikat o potpisivanju kasnije istekne ili ga CA opozove, strogi validator više ne može da razlikuje potpis napravljen dok je sertifikat bio važeći od onog koji je falsifikovan nakon njegovog isteka. Potpis je bio u okru na dan kada je napravljen, a postaje neverifikovan bez krivice samog potpisnika

Dugoročno arhiviranje ovo rešava u dva koraka. Prvo, proverena treća strana, Autoritet za izdavanje vremenskih žigova (Time Stamping Authority - TSA), kriptografski potvrđuje vreme, tako da ono više ne zavisi od poštenja potpisnika. Drugo, svaki sertifikat, odgovor o opozivu i CRL potreban za izgradnju i proveru lanca poverenja ugrađeni su unutar samog PDF-a, tako da validacija ne zavisi od servera koji mogu nestati do trenutka kada neko pogleda dokument. PAdES, standardizovan kao ETSI EN 319 142-1, klasifikuje ovo kroz osnovne nivoe, a PDFium komponenta upisuje strukture koje svaki nivo zahteva

Šta je LTV ili arhivski-vremenski PDF potpis?

PAdES definiše četiri osnovna nivoa koji se grade jedan na drugom, a PDFium komponenta ih izlaže kroz enumeraciju TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). B-B je običan potpis. B-T dodaje provereni vremenski žig preko vrednosti potpisa. B-LT (long-term - dugoročni) dodaje ugrađeni materijal za validaciju, što je svojstvo na koje većina ljudi misli pod pojmom "LTV". B-LTA (long-term with archive timestamp - dugoročni sa arhivskim žigom) obmotava sve u još jedan vremenski žig koji pokriva celu datoteku, tako da je sam ugrađeni materijal dokazivo netaknut od trenutka arhiviranja

Praktično tumačenje je stepenište. B-T dokazuje kada. B-LT dokazuje pomoću čega se potpis još uvek može proveriti. B-LTA dokazuje da ceo paket nije menjan od kada je zapečaćen, i to je nivo koji obnavljate, dodavanjem novog DocTimeStamp-a pre nego što prethodni istekne, kako biste produžili arhivu na neodređeno vreme. Za ugovor ili zapis o usaglašenosti sa obavezom dugog čuvanja, B-LTA je cilj; B-LT je pragmatični minimum

Dodavanje proverenog vremena: PAdES B-T sa RFC 3161

PDFium komponenta pretvara B-B potpis u B-T postavljanjem dva polja u klasi TPadesSignOptions: podiže Level na plB_T i navodi TsaUrl. Kada su oba prisutna, proces potpisivanja hešira sirove oktete potpisa pomoću SHA-256, pakuje taj sažetak (digest) kao RFC 3161 messageImprint, šalje POST zahtev na TSA 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 unsignedAttrs [1] strukture SignerInfo, prema EN 319 142-1 §6.3. Vremenski žig pokriva specifično vrednost potpisa, što je ono što povezuje provereno vreme sa 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 heš, u heksadecimalnom obliku, sertifikata u skladištu "MY" trenutnog korisnika (Current User) čiji privatni ključ možete koristiti. Polje Nonce je RFC 3161 vrednost za sprečavanje ponavljanja (anti-replay); ostavite ga na nuli i komponenta izvodi jedinstvenu vrednost po zahtevu iz SHA-256 preklapanja brojača, sata, broja otkucaja (tick count) i ID-a procesa, tako da se dva zahteva izdata u istoj milisekundi ne sudare. Unesite sopstvenu vrednost samo ako imate kriptografski RNG (generator nasumičnih brojeva) kojem radije verujete. Jedna iskrena napomena: B-T zahteva dostupan TSA, tako da potpisivanje sada upućuje mrežni poziv i zavisi od dostupnosti i kašnjenja samog TSA servisa

Ugradnja materijala za validaciju: B-LT i B-LTA u jednom pozivu

Prelazak na dugoročnu validaciju je jednostavan: postavite Level na plB_LTA i zadržite TsaUrl. PDFium komponenta zatim prolazi kroz celo stepenište unutar jednog poziva SignPades. Ona potpisuje B-B, stavlja vremenski žig za B-T, ubacuje Document Security Store (DSS) za B-LT i dodaje arhivski vremenski žig za B-LTA, svaki kao sopstveno inkrementalno ažuriranje tako da raniji bajtovi ostaju netaknuti u 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 nivo B-LT, PDFium komponenta gradi lanac sertifikata pomoću funkcije CertGetCertificateChain i upisuje /DSS rečnik koji nosi sertifikat potpisnika plus svaki posrednički CA u nizu /Certs (sa paralelnim nizovima /OCSPs i /CRLs), zajedno sa markerom /Extensions /ESIC na Nivou 1, tačno onako kako propisuje EN 319 142-1 §5.4.2. Samopotpisani koren (self-signed root) je namerno izostavljen, pošto RFC 5652 §10.2.3 to dozvoljava, a koren je već sidro poverenja (trust anchor) koje validator poseduje. Rezultat je potpis koji čitalac može da verifikuje samo sa datotekom u ruci

Za nivo B-LTA, komponenta dodaje vremenski žig dokumenta (Document Time-stamp): rečnik potpisa sa unosom /SubFilter /ETSI.RFC3161 čiji /ByteRange obuhvata celu datoteku, dok njegov unos /Contents drži RFC 3161 token preko tog opsega, i podiže ESIC marker na Nivo 2. Ovo je arhivski korak prema §5.4.3 i TS 119 142-3. Pošto DocTimeStamp pokriva DSS kao i potpis, on dokazuje da je ugrađeni materijal za validaciju bio prisutan i nepromenjen u vreme arhiviranja, što je upravo ono što dugoročna politika čuvanja mora da pokaže

Dopunjavanje potpisa koji već postoji

Ponekad je potpis već na dokumentu i potrebno je samo da dodate ili osvežite skladište za validaciju, na primer da biste potpis treće strane na nivou B-B podigli na B-LT za svoju arhivu. PDFium komponenta izlaže DSS injektor direktno kroz metodu SaveAsPadesDss, koja dodaje strukture /DSS i /Extensions kao inkrementalno ažuriranje bez dodirivanja 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 sertifikate, i opciono OCSP odgovore i CRL liste koje će validatoru biti potrebni. Postavite EsicExtensionLevel na 1 za B-LT skladište ili na 2 kada će slediti DocTimeStamp. Ostavite IncludeVri na podrazumevanoj vrednosti False: standard EN 319 142-1 §5.4.2.3 tretira /VRI rečnik po potpisu kao opcioni i savetuje da se ne koristi osim ako to ne zahteva specifični čitač koji ciljate

Troškovi i granice koje vredi planirati

Tri stvarna ograničenja oblikuju gde se ovi nivoi uklapaju. Prvo, kriptografski pozadinski program (backend) je dostupan samo na Windows-u: potpisivanje i vremensko žigosanje prolaze kroz platforme CNG i WinHttp skladišta, tako da PadesCryptoAvailable vraća False na drugim sistemima i metod SignPades podiže izuzetak. Inspekcija na strani čitanja, pokrivena u pratećem članku, ostaje višeplatformska (cross-platform); samo je upisivanje potpisa vezano za Windows. Drugo, B-T i B-LTA nivoi zavise od TSA servisa, što znači mrežni krug u vreme potpisivanja i eksterni servis čija dostupnost i ograničenja brzine zahteva postaju deo vašeg procesa potpisivanja

Treće, svaki nivo košta skladišnog prostora. Svaki korak dodaje inkrementalno ažuriranje umesto da ponovo piše datoteku, DSS ugrađuje pun lanac sertifikata, a arhivski DocTimeStamp rezerviše prostor za svoj token, tako da je B-LTA datoteka značajno veća od originalne B-B datoteke. To je svestan kompromis: trošite bajtove sada da biste kupili mogućnost verifikacije kasnije. Za većinu arhiva ugovora i usaglašenosti to je pravi kompromis, ali vredi izvršiti merenja na sopstvenim dokumentima pre donošenja odluka. Kada treba da potvrdite da je završena datoteka zaista dostigla nivo koji ste nameravali, verifikujte je tehnikama iz članka o inspekciji digitalnih PDF potpisa i PAdES nivoa, a ako šire učvršćujete proces obrade dokumenata, beleške o reviziji bezbednosnih rizika u PDF-u pokrivaju prateće provere

Funkcije PAdES potpisivanja, DSS-a i arhivskog vremenskog žiga prikazane ovde deo su komponente PDFium Component za Delphi i C++Builder, čija stranica proizvoda nosi kompletnu referencu potpisivanja i zahteve platforme