Tehnični članek

Dolgoročni podpisi PDF v Delphi: PAdES B-LT in B-LTA

Da bi se podpisan PDF lahko potrdil čez leta, ko potrdilo o podpisu poteče in se njegov izdajatelj CA zamenja, lahko komponenta PDFium Component ustvari dolgoročne podpise PAdES na sistemu Windows: časovni žig RFC 3161 za zaupanja vreden čas, varnostno shrambo dokumenta (Document Security Store - DSS), ki vgradi potrditveno gradivo, in arhivski časovni žig DocTimeStamp čez celotno datoteko. Ti trije dodatki so izhodiščne ravni PAdES B-T, B-LT in B-LTA, komponenta PDFium Component pa jih doseže vse z enim samim klicem za podpisovanje. To je zmogljivost, ki je na voljo le za Windows in jo varuje PadesCryptoAvailable

Ta članek je tretji v seriji. Prvi, podpisovanje PDF-jev s PAdES B-B s PDFium VCL, pokriva osnovni podpis; drugi, pregled digitalnih podpisov PDF in ravni PAdES, pokriva branje podpisa in ugotavljanje, katero raven je dosegel. Tukaj pa je skrb arhiv: podpisi, ki morajo preživeti potek veljavnosti potrdil in ostati preverljivi za obdobje hrambe, merjeno v letih in ne tednih

Zakaj veljaven podpis PDF čez čas preneha veljati?

Osnovni podpis odgovarja le na eno vprašanje: ali so bili ti bajti po podpisovanju spremenjeni. Sam po sebi pa ne dokazuje, kdaj se je podpisovanje zgodilo, in ta vrzel je tisto, karat ga pozneje zlomi. Struktura CMS prenaša atribut časa podpisovanja, vendar podpisnik to vrednost napiše iz lastne ure, zato validator nima razloga, da bi ji zaupal. Ko podpisno potrdilo pozneje poteče ali ga izdajatelj CA prekliče, strogi validator ne more več razlikovati med podpisom, ustvarjenim, ko je bilo potrdilo še veljavno, in tistim, ki je bil ponarejen po njegovem izteku. Podpis je bil na dan nastanka v redu, nato pa brez lastne krivde postane nepreverljiv

Dolgoročno arhiviranje to reši v dveh korakih. Prvič, zaupanja vredna tretja oseba, organ za časovno žigosanje (Time Stamping Authority - TSA), kriptografsko potrdi čas, tako da ta ni več odvisen od poštenosti podpisnika. Drugič, vsako potrdilo, odziv o preklicu in CRL, ki so potrebni za izgradnjo in preverjanje verige zaupanja, so vgrajeni v sam PDF, tako da potrjevanje ni odvisno od strežnikov, ki jih ob pregledu morda ni več. Standard PAdES, standardiziran kot ETSI EN 319 142-1, te plasti uvršča med izhodiščne ravni, komponenta PDFium Component pa zapisuje strukture, ki jih zahteva posamezna raven

Kaj je podpis PDF LTV ali podpis z arhivskim časovnim žigom?

PAdES definira štiri izhodiščne ravni, ki gradijo ena na drugi, komponenta PDFium Component pa jih razkriva prek naštevanja TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). B-B je preprost podpis. B-T doda zaupanja vreden časovni žig čez vrednost podpisa. B-LT (dolgoročni) doda vgrajeno potrditveno gradivo, kar večina ljudi razume pod izrazom "LTV". B-LTA (dolgoročni z arhivskim časovnim žigom) pa ovije vse skupaj v še en časovni žig, ki pokriva celotno datoteko, tako da je samo vgrajeno gradivo dokazljivo nedotaknjeno od trenutka arhiviranja

Praktično branje je stopnišče

Praktično branje je stopnišče. B-T dokazuje kdaj. B-LT dokazuje s čim je podpis še vedno mogoče preveriti. B-LTA dokazuje, da celoten paket ni bil spremenjen, odkar je bil zapečaten, in to je raven, ki jo obnovite z dodajanjem svežega žiga DocTimeStamp, preden prejšnji poteče, da podaljšate arhiv za nedoločen čas. Za pogodbo ali zapis o skladnosti z dolgo obveznostjo hrambe je B-LTA cilj, B-LT pa pragmatični prag

Dodajanje zaupanja vrednega časa: PAdES B-T z RFC 3161

Komponenta PDFium Component spremeni podpis B-B v B-T z nastavitvijo dveh polj na TPadesSignOptions: dvignite Level na plB_T in navedite TsaUrl. Ko sta prisotna oba, podpisni cevovod zgosti surove bajte podpisa s SHA-256, zapakira ta izvleček kot RFC 3161 messageImprint, pošlje (POST) zahtevo na TSA prek WinHttp in vgradi vrnjeni žeton kot neopodpisani atribut signature-time-stamp (OID 1.2.840.113549.1.9.16.2.14) v SignerInfo unsignedAttrs [1], v skladu z EN 319 142-1 §6.3. Časovni žig pokriva specifično vrednost podpisa, wat povezuje zaupanja vreden čas s tem natančnim 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;

CertificateThumbprint je zgoščena vrednost SHA-1 v heksadecimalni obliki za potrdilo v shrambi trenutnega uporabnika "MY", katerega zasebni ključ lahko uporabite. Polje Nonce je vrednost proti ponovitvam (anti-replay) po RFC 3161; pustite jo na nič in komponenta bo za vsako zahtevo izpeljala edinstveno vrednost iz zgoščevanja SHA-256 števca, ure, taktov in ID-ja procesa, tako da dve zahtevi, izdani v isti milisekundi, ne trčita. Lastno vrednost podajte le, če imate kriptografski RNG, ki mu raje zaupate. Iskreno opozorilo: B-T potrebuje dosegljiv TSA, zato podpisovanje zdaj opravi omrežni klic in podeduje razpoložljivost ter latenco TSA-ja

Vgradnja potrditvenega gradiva: B-LT in B-LTA z enim klicem

Korak naprej do dolgoročnega potrjevanja je ena sama sprememba: nastavite Level na plB_LTA in obdržite TsaUrl. Komponenta PDFium Component nato izvede celotno stopnišče znotraj enega klica SignPades. Podpiše B-B, časovno žigosa za B-T, vnese Document Security Store za B-LT in doda arhivski časovni žig za B-LTA, vsakega kot lastno inkrementalno posodobitev, tako da prejšnji bajti ostanejo bajt za bajtom nedotaknjeni

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 stopnjo B-LT komponenta PDFium Component zgradi verigo potrdil s CertGetCertificateChain in zapiše slovar /DSS, ki prenaša potrdilo podpisnika ter vsak vmesni CA v polju /Certs (z vzporednimi polji /OCSPs in /CRLs), skupaj z označevalcem /Extensions /ESIC na ravni 1, natanko tako, kot predpisuje EN 319 142-1 §5.4.2. Samopodpisani koren je namerno izpuščen, saj RFC 5652 §10.2.3 to dovoljuje, koren pa je že sidro zaupanja, ki ga ima validator. Rezultat je podpis, ki ga bralnik lahko preveri le z datoteko v roki

Za B-LTA komponenta doda časovni žig dokumenta (Document Time-stamp): podpisni slovar s /SubFilter /ETSI.RFC3161, katerega /ByteRange obsega celotno datoteko, njegov /Contents pa drži žeton RFC 3161 čez to območje, in promovira označevalec ESIC na raven 2. To je arhivski korak po §5.4.3 in TS 119 142-3. Ker DocTimeStamp pokriva DSS in tudi podpis, dokazuje, da je bilo vgrajeno potrditveno gradivo prisotno in nespremenjeno v času arhiviranja, kar je natanko tisto, kar mora dolgoročna politika hrambe dokazati

Dopolnjevanje že obstoječega podpisa

Včasih je podpis že na dokumentu in morate le dodati ali osvežiti shrambo za potrjevanje, na primer da prenesete podpis B-B tretje osebe na B-LT za vaš arhiv. Komponenta PDFium Component izpostavlja DSS injektor neposredno prek SaveAsPadesDss, ki doda strukturi /DSS in /Extensions strukture kot inkrementalno posodobitev brez dotikanja obstoječih bajtov podpisa

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;

Zagotovite potrdila v kodiranju DER in po želji odzive OCSP ter CRL-je, ki jih bo validator potreboval. Nastavite EsicExtensionLevel na 1 za shrambo B-LT ali na 2, ko bo sledil DocTimeStamp. Pustite IncludeVri na privzeti vrednosti False: EN 319 142-1 §5.4.2.3 obravnava slovar /VRI na podpis kot neobvezen in svetuje proti njemu, razen če ga specifičen bralnik, ki ga ciljate, zahteva

Stroški in meje, za katere je vredno načrtovati

Tri resne omejitve oblikujejo uporabnost teh ravni. Prvič, kriptografsko ozadje je le za Windows: podpisovanje in časovno žigosanje potekata prek shramb platforme CNG in WinHttp, zato PadesCryptoAvailable drugod vrne False, SignPades pa sproži izjemo. Pregled na strani branja, zajet v spremnem članku, ostaja večplatformski; le zapisovanje podpisov je vezano na Windows. Drugič, B-T in B-LTA sta odvisna od organa za časovno žigosanje (TSA), kar pomeni omrežni klic v času podpisovanja ter zunanjo storitev, katere čas delovanja in omejitve postanejo del vaše poti podpisovanja

Tretjič, vsaka raven porabi prostor za shranjevanje. Vsaka stopnja doda inkrementalno posodobitev, namesto da bi znova zapisala datoteko, DSS vgradi celotno verigo potrdil, arhivski DocTimeStamp pa rezervira prostor za svoj žeton, zato je datoteka B-LTA pomembno večja od izvirnika B-B. To je namerna menjava: zdaj porabite bajte, da kupite preverljivost pozneje. Za večino arhivov pogodb in skladnosti je to prava menjava, vendar jo je vredno izmeriti na lastnih dokumentih, namesto da bi jo predvidevali. Ko morate potrditi, da je končna datoteka dejansko dosegla želeno raven, jo preverite s tehnikami v pregledu digitalnih podpisov PDF in ravni PAdES, če pa širše utrjujete cevovod dokumentov, opombe o reviziji varnostnih tveganj PDF pokrivajo okoliške preglede

Tukaj prikazane funkcije podpisovanja PAdES, DSS in arhivskega časovnega žiga so del komponente PDFium Component za Delphi in C++Builder, katere produktna stran prinaša celotno podpisno referenco in zahteve platforme