Techninis straipsnis

PAdES LTV įrodymai ir sėklos reikšmės HotPDF

Ką tik pasirašytas PDF yra B-B parašas ir nieko daugiau. Jis įrodo, kas pasirašė, ir kad baitai neslinko, bet jis neturi jokio įrodymo, kad pasirašiusiojo sertifikatas pasirašymo metu buvo teisėtas, todėl tikrintojui po metų teks ieškoti atšaukimo duomenų, kurių jau gali nebėti. To spragos užtaisymas reiškia OCSP atsakų ir CRL įrašymą į dokumento lygio Document Security Store, o HotPDF tai vienas iškvietimas: PopulatePAdESLTVEvidence apeina kiekvieną įkeltą parašą, išvestina atšaukimo užklausas iš sertifikatų rinkinio, vykdo jas per jūsų pateiktą transportą ir įrašo gautą medžiagą plus CMS grandinę į DSS. Grąžina parašų, kurių įrodymai atsidūrė, skaičių arba minus vienetas, kai dokumente apskritai nėra parašų lauko

Projektavimo sprendimas, vertas supratimo prieš pradedant naudoti, yra tas, kad biblioteka niekada neatidaro lizdo (socket). Kiekvienas baitas, atkeliavęs iš tinklo, atkeliauja per jūsų parašytą atgalinį iškvietimą. Tai ne atsargumas dėl atsargumo; tai vienintelis būdas, kuriuo ši savybė gali veikti tose aplinkose, kurios iš tikrųjų reikalauja ilgalaikio tikrinimo

Kodėl biblioteka atsisako pati daryti HTTP?

Nes vietos, reikalaujančios B-LT parašų, yra vietos, kuriose bibliotekos tinklas negali būti patikėtas. Pasirašymo tarnybos veikia už tapatybę tikrinančių įgaliotųjų serverių su įmoninėmis šaknimis. Atskirtos nuo oro pasirašymo pakopos neturi kelio iki atsakiklio ir turi būti maitinamos podėlyje laikomais įrodymais. Audito režimai reikalauja, kad kiekviena išsiunčiama užklausa būtų į žurnalą įrašyta programos, o ne užkasta priklausomybėje. Ir testų rinkiniai reikalauja deterministinių atsakų, o to neįmanoma, jei biblioteka pati skambina išorėn

Transportas yra paprasta funkcijos nuoroda su fiksuota forma, todėl politika lieka jūsų. HotPDF perduoda jums užklausos įrašą, tiksliai aprašantį, ką gauti, įskaitant turinio tipą ir atsako dydžio ribą, o jūs grąžinate baitus plus būseną

HotPDF PopulatePAdESLTVEvidence eiga: iškviečiančiojo pateiktas FetchEvidence transportas, užklausos įrašo laukai ir būsenos išdavos pagal parašą
Kiekvienas tinklo baitas keliauja per jūsų FetchEvidence atgalinį iškvietimą, o kiekvienas parašas gauna savo būseną, kad vienas laukas niekada nenutrauktų apėjimo
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 sako, ar tai OCSP POST, ar CRL GET;
    // Request.ContentType ir Request.Body jau paruošti,
    // o Request.MaxResponseBytes yra riba, kurios privalote laikytis
    Response := HttpExchange(Request.URI, Request.ContentType,
      Request.Body, Request.MaxResponseBytes);
    Result := setsSucceeded;
  except
    on E: Exception do
    begin
      ErrorMessage := E.Message;
      // setsRetry leidžia pakartojimo politikai atsitraukti; naudokite
      // setsPermanentFailure 404 arba blogam URL
      Result := setsRetry;
    end;
  end;
end;

// Vieno iškvietimo B-B į B-LT atnaujinimas kiekvienam įkelto failo parašui
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
      // Tik priedų įrašymas: baitai, kuriuos dengia esami parašai,
      // išsaugomi iki žodžio
      Pdf.SaveIncrementalUpdate('signed-lt.pdf');
  finally
    Pdf.Free;
  end;
end;

Nesėkmės yra po parašą, o ne po dokumentą. Atsakiklis, kuriam vienam pasirašiusiajam pasibaigė laikas, praleidžia to pasirašiusiojo medžiagą ir palieka likusį apėjimą nepaliestą — tai elgsena, kurios norite partijoje: daliniai įrodymai nugalą nutrauktą seką, o grąžos reikšmė pasako, kiek parašų iš tikrųjų patobulėjo

Grandinė, kurią CMS užmiršo įtraukti

Atšaukimo patikrai reikia išdavėjo sertifikato, o stebėtinai daug pasirašymo krūvų praleidžia tarpinius CMS konteineryje. Atkūrimo kelias yra Authority Information Access plėtinys, prieigos metodas 1.3.6.1.5.5.7.48.2, skelbiantis URL, iš kurio išdavėjo sertifikatas gali būti parsisiųstas. HPDFFetchAIAIntermediates apeina tuos URL per tą patį transportą, iš kiekvieno atsako išanalizuoja DER ir grąžina tik tuos sertifikatus, kurių CMS dar nenešė, su raktu pagal DER maišą, kad dubliai ir ciklai negalėtų suktis

Dvi detalės nusprendžia, ar tai veikia prieš tikrus sertifikatų centrus. Pirma yra koduotė: CA galiniai taškai sertifikatą patiekia kaip žaliąjį DER maždaug taip pat dažnai, kaip PEM šarvuotą, ir nėra patikimo turinio tipo, juos atskirti. Patikimas zondas yra tekstualinis, tada struktūrinis. Ieškokite -----BEGIN CERTIFICATE----- ženklo, jei jis yra — nulupkite šarvus ir iškoduokite base64, o abiejose keliuose patvirtinkite, kad pirmasis rezultato baitas yra $30, DER ženklas SEQUENCE. Antra yra gylis: gautasis tarpinis pats gali skelbti AIA URL savo išdavėjui, todėl apėjimas prie eilės prideda naujus kandidatus ir užbaigia grandines, kurias skiria du ar trys šuoliai. To reikia riboti — tam yra MaxFetch parametras

AIA grandinių užbaigimo HotPDF diagrama: caIssuers URL gavimas, PEM prieš DER zondas, DER maišos dedubliavimas ir MaxFetch gylio riba
HPDFFetchAIAIntermediates apeina caIssuers URL per tą patį transportą, zondavoja PEM šarvus ir riboja eilę su MaxFetch

Kas yra parašo sėklos reikšmė ir kodėl ji nepavyksta tyloje?

Sėklos reikšmė (seed value) yra apribojimas, kurį dokumento autorius prideda prie parašo lauko, kad pasakyti pasirašytojui, koks parašas priimtinas: kuris SubFilter, kuri maišos algoritmą, kurios priežastys, kuri mažiausia PDF versija, ar atšaukimo informacija turi būti įterpta. Ji gyvena /SV žodyne ant lauko ir apibrėžta ISO 32000-1 §12.7.5.5. HotPDF ją rašo su AttachPAdESSeedValue ir tikrina su CheckLoadedSignatureSeedValue, grąžinančia True, kai laukas be apribojimų arba kiekvienas esamas apribojimas tenkinamas, o False atveju įvardija pirmąjį nesėkmingą apribojimą per išvesties parametrą, kurį galima tiesiai įdėti į klaidos pranešimą

Mechanizmas, dėl kurio sėklos reikšmes lengva padaryti klaidingai, yra §12.7.5.5.3 aprašytas /Ff vėliavėlių įrašas. Nustatytas bitas žymi savo apribojimą kaip privalomą: nesutapimas yra klaida ir pasirašytojas privalo atsisakyti. Išvalytas bitas žymi tą patį apribojimą kaip pageidaujamą: reikšmė filtruoja, ką UI turėtų siūlyti, ir nieko daugiau. Iš to seka du spąstai. Pirma, /Ff gyvena /SV žodyno viduje, o ne ant valdiklio anotacijos, todėl kodas, skaitantis lauko lygio /Ff, amžinai gauna tuščią atsakymą ir daro išvadą, kad niekas neprivaloma. Antra, bitų priskyrimai nėra paprasta eilutė vienas, du, keturi, aštuoni; HotPDF rašyklė skleidžia 2 SubFilter, 4 MinVersion, 32 AddRevInfo ir 64 DigestMethod. Skaitytojas, manantis nuoseklių bitų, kiekvieną apribojimą iškodoja kaip pasirinktinį ir išlaiko visus testus, išskyrus tą vieną, kuris svarbiausia

Sėklos reikšmės vėliavėlių bitų lentelė HotPDF PAdES pasirašymui, rodanti Ff bitus 2, 4, 32 ir 64 bei privalomo ir pageidaujamo apribojimo traktavimą
Įrašas /Ff gyvena /SV viduje, ir kiekviena bitų vieta nusprendžia, ar nesutapimas yra kietas atsisakymas, ar UI pageidavimas
var
  Violation: AnsiString;
begin
  // Paklauskite lauko, ar profilis, kuriuo ketiname pasirašyti, leidžiamas
  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));
  // Apribojimas tenkintas: tęskite pasirašymo seką
end;

Testas, atvėręs pradinę dekodavimo klaidą, nebuvo teigiamasis testas. Buvo teiginys, kad privalomas nesutapimas turi būti atmestas, ir tai vienintelė testų rūšis, galinti pagauti šios klasės defektą: dekoderis, skaitantis neteisingą žodyną ar neteisingas bitų vietas, kiekvienai įvečiai duoda „jokių pažeistų apribojimų“, kas atrodo lygiai kaip teisinga elgsena, kol sąmoningai nepažeidžiate vieno

Kur tai stovi LTV kopėčiose

Keturi laipteliai, ir kiekvienam reikia žemiau esančio. B-B yra nuogas parašas. B-T prideda patikimą laiko žymą, kuri užfiksuoja pasirašymo laiką, todėl tikrintojas žino, kurį momentą vertinti atšaukimą. B-LT prideda atšaukimo įrodymus į DSS — tai, ką automatiškai daro PopulatePAdESLTVEvidence. B-LTA prideda dokumento laiko žymas, atnaujinamas prieš tai, kol ankstesnė nusilpsta, ir besąlygiškai plėtinančias galiojimą; HotPDF tai atveria kaip RenewPAdESLTATimestamp, pridedantis naują laiko žymą kaip prieauginę reviziją ir išsaugantis kiekvieną ankstesnį parašą, laiko žymą ir DSS įrašą nepaliestą

Prieauginio atnaujinimo modelis yra vienintelis teisingas būdas pridėti įrodymus prie pasirašyto dokumento, nes failo perrašymas sugadintų baitų intervalus, kuriuos dengia esami parašai. Jeigu reikia samprotuoti, kas pasikeitė tarp revizijų, ir ar tie pokyčiai yra tokios rūšies, kurią leistų parašas, ta analizė atskirai dengiama DocMDP ir FieldMDP revizijų analizėje. Pats pasirašymo konvejeris, įskaitant sertifikatų šaltinius ir baitų eiliškumo spąstus, yra PAdES pasirašymo apžvalgoje, o tikrinimo pusė — parašų tikrinime įkeltuose dokumentuose

Vienas praktinis įspėjimas dėl eiliškumo. Rinkite įrodymus kuo greičiau po pasirašymo, idealiu atveju toje pačioje užduotyje. Atsakikliai, galintys atsakyti už sertifikatą, yra internete, kol sertifikatas galioja, ir dingsta po metų, todėl dokumentas, išeinantis iš jūsų konvejerio kaip B-B, gali daugiau niekada nepakilti. HotPDF veikia kaip savoji VCL komponentė Delphi ir C++Builder aplinkose, o visas įrodymų apėjimas vyksta procese, išskyrus jūsų pačių transportą; palaikomi profiliai išvardyti HotPDF Delphi PDF component produkto puslapyje