Tehnični članak

Dokazila PAdES LTV in vrednosti semena v HotPDF

PDF, ki ste ga pravkar podpisali, je podpis B-B in nič več. Dokazuje, kdo je podpisal, in da se bajti niso premaknili, ne nosi pa dokaza, da je bilo certifikat podpisnika veljaven ob času podpisovanja, zato mora validator leta od zdaj iti iskat podatke o preklicu, ki morda ne obstajajo več. Zapiranje te vrzeli pomeni pisanje odgovorov OCSP in CRL v varnostno shrambo dokumenta na ravni dokumenta, v HotPDF pa je to en klic: PopulatePAdESLTVEvidence prehodi vsak naložen podpis, izpelje zahteve po preklicu iz nabora certifikatov, izvede jih skozi transport, ki ga preskrbite, in zapiše pridobljeno gradivo plus verigo CMS v DSS. Vrne število podpisov, katerih dokazila so pristala, ali minus ena, ko dokument sploh nima polja podpisa

Odločitev zasnove, vredna razumevanja, preden jo uporabite, je, da knjižnica nikoli ne odpre vtičnice. Vsak bajt, ki prispe iz omrežja, prispe skozi povratni klic, ki ste ga napisali. To ni previdnost sama sebi namen; to je edini način, kako lahko ta funkcija deluje znotraj okolij, ki dejansko zahtevajo dolgoročno validacijo

Zakaj knjižnica odkloni lasten HTTP?

Ker so mesta, ki zahtevajo podpise B-LT, mesta, kjer knjižnici ni mogoče zaupati z omrežjem. Podpisovalne storitve tečejo za overjajočimi posredniki s koreninami podjetja. Podpisovalne plasti v brezzračni reži (air-gapped) nimajo poti do odgovornega in jih je treba hraniti s predpomnjenimi dokazili. Režimi revizije zahtevajo, da vsako odhodno zahtevo zapiše aplikacija in ne zakopana v odvisnost. In testne zbirke potrebujejo deterministične odgovore, kar je nemogoče, če knjižnica klice ven sama

Transport je običajna referenca funkcije s fiksno obliko, zato politika ostane vaša. HotPDF vam izroči zapis zahteve, ki opisuje natanko, kaj pridobiti, vključno s tipom vsebine in omejitvijo velikosti odgovora, vi pa vrnete bajte plus stanje

Tok PopulatePAdESLTVEvidence HotPDF: transport FetchEvidence, preskrbljen s strani klicatelja, polja zapisa zahteve in stanjski izidi na podpis
Vsak omrežni bajt gre skozi vaš povratni klic FetchEvidence in vsak podpis dobi svoje stanje, tako da ena časovna omejitev nikoli ne prekine prehoda
function FetchEvidence(const Request: THPDFSignatureEvidenceRequest;
  Attempt: Integer; CancellationToken: THPDFCancellationToken;
  out Response: TBytes; out RetryAfterMS: Cardinal;
  out ErrorMessage: UnicodeString): THPDFSignatureEvidenceTransportStatus;
begin
  RetryAfterMS := 0;
  try
    // Request.Kind pove, ali je to OCSP POST ali CRL GET;
    // Request.ContentType in Request.Body sta že pripravljena,
    // Request.MaxResponseBytes pa je omejitev, ki jo morate upoštevati
    Response := HttpExchange(Request.URI, Request.ContentType,
      Request.Body, Request.MaxResponseBytes);
    Result := setsSucceeded;
  except
    on E: Exception do
    begin
      ErrorMessage := E.Message;
      // setsRetry pusti politiko ponovitve odstopiti; uporabite
      // setsPermanentFailure za 404 ali slab URL
      Result := setsRetry;
    end;
  end;
end;

// Nadgradnja B-B v B-LT z enim klicem za vsak podpis v naloženi datoteki
var
  Pdf: THotPDF;
  Upgraded: Integer;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.BeginIncrementalUpdate('signed.pdf');
    Upgraded := Pdf.PopulatePAdESLTVEvidence(FetchEvidence,
      THPDFSignatureEvidenceRetryPolicy.Default);
    if Upgraded > 0 then
      // Samo-pripeto shranjevanje: bajti, ki jih obstoječi podpisi
      // pokrivajo, so ohranjeni dobesedno
      Pdf.SaveIncrementalUpdate('signed-lt.pdf');
  finally
    Pdf.Free;
  end;
end;

Odpovedi so na podpis in ne na dokument. Odgovorni, ki mu zteče čas za enega podpisnika, preskoči gradivo tega podpisnika in pusti preostanek prehoda nedotaknjen, kar je vedenje, ki ga želite v paketu: delna dokazila premagajo prekinjen tek, povratna vrednost pa vam pove, koliko podpisov se je dejansko izboljšalo

Veriga, ki je CMS pozabil vključiti

Preverjanje preklica potrebuje certifikat izdajatelja in presenetljivo število podpisovalnih skladi izpusti vmesne iz CMS vsebnika. Pot okrevanja je razširitev Authority Information Access, metoda dostopa 1.3.6.1.5.5.7.48.2, ki oglašuje URL, kjer je certifikat izdajatelja mogoče prenesti. HPDFFetchAIAIntermediates prehodi te URL-je skozi isti transport, razčleni DER iz vsakega odgovora in vrne samo certifikate, ki jih CMS ni že nosil, ključane po DER zgostitvi, tako da podvojitve in zanke ne morejo vrten

Dve podrobnosti odločita, ali to deluje proti pravim certifikacijskim avtoritetam. Prva je kodiranje: končne točke CA strežejo certifikat kot goli DER približno enako pogosto, kot ga strežejo PEM oklepljenega, in ni zanesljivega tipa vsebine za razlikovanje. Trdna sonda je besedilna, nato strukturna. Poiščite oznako -----BEGIN CERTIFICATE-----, odstranite oklep in dekodirajte base64, če je prisoten, in na obeh poteh potrdite, da je prvi bajt rezultata $30, oznaka DER za SEQUENCE. Druga je globina: pridobljena vmesna lahko sama oglašuje URL AIA za svojega izdajatelja, zato prehod pripne nove kandidate v vrsto in dopolni verige, ki so dva ali tri skoki kratki. To je treba omejiti, za kar je parameter MaxFetch

Diagram dopolnitve verige AIA za HotPDF: pridobitev URL caIssuers, sonda PEM proti DER, odstranjevanje podvojenih DER zgostitev in omejitev globine MaxFetch
HPDFFetchAIAIntermediates prehodi URL-je caIssuers skozi isti transport, sondira PEM oklep in omejuje vrsto z MaxFetch

Kaj je vrednost semena podpisa in zakaj odpove tiho?

Vrednost semena (seed value) je omejitev, ki jo avtor dokumenta pripne polju podpisa, da pove podpisniku, kakšna vrsta podpisa je sprejemljiva: kateri SubFilter, kateri algoritem prebave, kateri razlogi, katera najmanjša različica PDF, ali mora biti informacija o preklicu vgrajena. Živi v slovarju /SV na polju in je definirana v ISO 32000-1 §12.7.5.5. HotPDF jo zapiše z AttachPAdESSeedValue in preveri z CheckLoadedSignatureSeedValue, ki vrne True, ko je polje neomejeno ali vsaka prisotna omejitev gre, in ob False poimenuje prvo odpovedano omejitev skozi izhodni parameter, ki ga lahko date naravnost v sporočilo napake

Mehanizem, ki naredi vrednosti semena enostavne za pokvariti, je vnos zastavic /Ff, opisan v §12.7.5.5.3. Nastavljeni bit označi svojo omejitev kot zahtevano: neskladje je napaka in podpisnik mora odkloniti. Čist bit označi isto omejitev kot preferenco: vrednost filtrira, kaj naj vmesnik ponudi, in nič več. Dve pasti sledita iz tega. Prvič, /Ff živi znotraj slovarja /SV in ne na pripombi gradnika (widget annotation), zato koda, ki bere /Ff na ravni polja, dobi prazen odgovor za vedno in sklepa, da nič ni vsiljeno. Drugič, dodelitve bitov niso enostaven tek ena, dva, štiri, osem; v HotPDF zapisovalnik izda 2 za SubFilter, 4 za MinVersion, 32 za AddRevInfo in 64 za DigestMethod. Bralec, ki predpostavi zaporedne bite, dekodira vsako omejitev kot neobvezno in gre vsak test razen tistega, ki šteje

Tabela bitov zastavic vrednosti semena za podpisovanje PAdES HotPDF, ki prikazuje bite Ff 2, 4, 32 in 64 ter obravnavo omejitev zahtevano proti preferirano
Vnos /Ff živi znotraj /SV in vsak bitni položaj odloča, ali je neskladje trda odklonitev ali preferenca vmesnika
var
  Violation: AnsiString;
begin
  // Vprašajte polje, ali je profil, s katerim se bomo podpisali, dovoljen
  if not Pdf.CheckLoadedSignatureSeedValue(0, 'ETSI.CAdES.detached',
       'SHA256', 'Approved for payment', 1, Violation) then
    raise Exception.Create('Signature field rejects this profile: ' +
      String(Violation));
  // Omejitev zadovoljena: nadaljujte s prehodom podpisovanja
end;

Test, ki je izpostavil izvirno napako dekodiranja, ni bil pozitiven test. Bila je trditev, da mora biti vsiljeno neskladje odklonjeno, in je edina vrsta testa, ki lahko ujame ta razred napak: dekodirnik, ki bere napačen slovar ali napačne bitne položaje, proizvede »brez kršenih omejitev« za vsak vhod, kar izgleda natanko kot pravilno vedenje, dokler ene namenoma ne skršite

Kje to stoji na lestvici LTV

Štiri stopnice in vsaka potrebuje tisto pod sabo. B-B je goli podpis. B-T doda zaupanja vreden časovni žig, ki fiksira čas podpisovanja, tako da validator ve, proti kateremu trenutku ovrednotiti preklic. B-LT doda dokazila preklica v DSS, kar je tisto, kar PopulatePAdESLTVEvidence samodejno opravi. B-LTA doda časovne žige dokumenta, ki se obnovijo, preden se prejšnji oslabi, podaljšujoč veljavnost neomejeno; HotPDF to izpostavi kot RenewPAdESLTATimestamp, ki pripne nov časovni žig kot inkrementalno revizijo in ohrani vsak zgodnejši podpis, časovni žig in vnos DSS nedotaknjene

Model inkrementalne posodobitve je edini pravilen način dodajanja dokazil podpisanemu dokumentu, ker bi prepisovanje datoteke prelomilo bajtne obsege, ki jih obstoječi podpisi pokrivajo. Če morate razmišljati o tem, kaj se je spremenilo med revizijami, in ali so te spremembe tiste vrste, ki jih podpis dovoljuje, je ta analiza pokrita ločeno v analizi revizij DocMDP in FieldMDP. Cevovod podpisovanja sam, vključno z viri certifikatov in pastmi bajtnega vrstnega reda, je v vodniku po podpisovanju PAdES, stran validacije pa v preverjanju podpisov na naloženih dokumentih

Eno praktično opozorilo o vrstnem redu. Zberite dokazila takoj po podpisovanju, idealno v istem opravilu. Odgovorni, ki lahko odgovarjajo za certifikat, so na spletu, medtem ko je certifikat trenuten, in odšli leta kasneje, zato dokument, ki zapusti vaš cevovod kot B-B, morda nikoli več ne bo nadgradljiv. HotPDF teče kot domača komponenta VCL za Delphi in C++Builder, celoten prehod dokazil pa je v procesu razen vašega lastnega transporta; podprti profili so navedeni na strani produkta HotPDF Delphi PDF component