PDF, ktoré ste práve podpísali, je podpis B-B a nič viac. Dokazuje, kto podpísal, a že bajty sa nepohli, ale nenesie žiadny dôkaz, že certifikát podpisovateľa bol v čase podpisu platný, takže validátor o roky neskôr musí ísť hľadať revokačné dáta, ktoré už možno neexistujú. Zavrieť tú medzeru znamená zapísať OCSP odpovede a CRL do Document Security Store na úrovni dokumentu a v HotPDF je to jedno volanie: PopulatePAdESLTVEvidence prejde každý načítaný podpis, odvodí revokačné požiadavky zo sady certifikátov, vykoná ich cez transport, ktorý dodáte, a zapíše stiahnutý materiál plus reťaz CMS do DSS. Vracia počet podpisov, ktorých dôkazy pristáli, alebo mínus jedna, keď dokument nemá vôbec žiadne pole podpisu
Návrhové rozhodnutie, ktoré stojí za pochopenie skôr, než to použijete, je, že knižnica nikdy neotvára socket. Každý bajt, ktorý prichádza zo siete, prichádza cez callback, ktorý ste napísali. Nie je to opatrnosť pre opatrnosť; je to jediný spôsob, ako táto funkcia môže fungovať v prostrediach, ktoré dlhodobú validáciu skutočne vyžadujú
Prečo knižnica odmieta robiť vlastné HTTP?
Pretože miesta, ktoré vyžadujú podpisy B-LT, sú miesta, kde sa knižnici nedá veriť so sieťou. Podpisovacie služby bežia za autentizujúcimi proxy s firemnými koreňmi. Od siete izolované podpisovacie vrstvy nemajú cestu k responderovi a musia byť kŕmené cacheovanými dôkazmi. Auditné režimy vyžadujú, aby každá odchádzajúca požiadavka bola logovaná aplikáciou, nie zakopaná v závislosti. A testovacie sady potrebujú deterministické odpovede, čo je nemožné, keď sa knižnica sama vytáča von
Transport je obyčajný odkaz na funkciu s pevným tvarom, takže politika zostáva vaša. HotPDF vám odovzdá záznam požiadavky popisujúci presne, čo stiahnuť, vrátane content typu a stropu veľkosti odpovede, a vy vrátite bajty plus status
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 hovorí, či je to OCSP POST alebo CRL GET;
// Request.ContentType a Request.Body sú už pripravené
// a Request.MaxResponseBytes je strop, ktorý musíte rešpektovať
Response := HttpExchange(Request.URI, Request.ContentType,
Request.Body, Request.MaxResponseBytes);
Result := setsSucceeded;
except
on E: Exception do
begin
ErrorMessage := E.Message;
// setsRetry nechá politiku opakovaní couvnuť; použite
// setsPermanentFailure pre 404 alebo zlú URL
Result := setsRetry;
end;
end;
end;
// Upgrade B-B na B-LT jedným volaním pre každý podpis v načítanom súbore
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
// Uloženie len pripojením: bajty, ktoré kryjú existujúce podpisy,
// sa zachovajú doslova
Pdf.SaveIncrementalUpdate('signed-lt.pdf');
finally
Pdf.Free;
end;
end;
Zlyhania sú per podpis, nie per dokument. Responder, ktorý pre jedného podpisovateľa prekročí čas, preskočí materiál toho podpisovateľa a zanechá zvyšok priebehu neporušený, čo je správanie, ktoré chcete v dávke: čiastočné dôkazy sú lepšie než prerušený beh a návratová hodnota vám povie, koľko podpisov sa naozaj zlepšilo
Reťaz, na ktorý CMS zabudol
Kontrola revokácií potrebuje certifikát vystaviteľa a prekvapivo veľa podpisovacích stohov vynecháva intermediates z kontajnera CMS. Cesta obnovy je rozšírenie Authority Information Access, access method 1.3.6.1.5.5.7.48.2, ktoré propaguje URL, odkiaľ sa certifikát vystaviteľa dá stiahnuť. HPDFFetchAIAIntermediates prejde tie URL cez ten istý transport, vyparsuje DER z každej odpovede a vracia len certifikáty, ktoré CMS už neniesol, kľúčované hashom DER, takže duplikáty a cykly sa nemôžu točiť
Dva detaily rozhodujú, či to funguje voči skutočným certifikačným autoritám. Prvý je kódovanie: endpointy CA podávajú certifikát ako holý DER približne rovnako často ako PEM obalený a neexistuje spoľahlivý content typ na ich rozlíšenie. Robustná sonda je textová, potom štrukturálna. Hľadajte marker -----BEGIN CERTIFICATE-----, ak je prítomný, ošúchajte obal a dekódujte base64 a v oboch cestách potvrďte, že prvý bajt výsledku je $30, DER tag pre SEQUENCE. Druhý je hĺbka: stiahnutý intermediate môže sám propagovať AIA URL pre svojho vlastného vystaviteľa, takže prechod pridáva nových kandidátov do fronty a dopĺňa reťaze, ktorým chýbajú dva alebo tri skoky. To musí byť ohraničené, na to slúži parameter MaxFetch
Čo je seed value podpisu a prečo zlyháva potichu?
Seed value je obmedzenie, ktoré autor dokumentu pripája k poľu podpisu, aby povedal podpisovateľovi, aký druh podpisu je prijateľný: ktorý SubFilter, ktorý digest algoritmus, ktoré dôvody, aká minimálna verzia PDF, či musí byť revokačná informácia vložená. Býva v slovníku /SV na poli a je definovaná v ISO 32000-1 §12.7.5.5. HotPDF ju zapisuje cez AttachPAdESSeedValue a kontroluje cez CheckLoadedSignatureSeedValue, ktorý vracia True, keď je pole bez obmedzení alebo všetky prítomné obmedzenia prechádzajú, a pri False menuje prvé padajúce obmedzenie cez výstupný parameter, ktorý môžete vložiť rovno do chybovej správy
Mechanizmus, ktorý robí seed values ľahko pokaziteľnými, je položka príznakov /Ff popísaná v §12.7.5.5.3. Nastavený bit značí svoje obmedzenie ako povinné: nesúlad je chyba a podpisovateľ musí odmietnuť. Vynulovaný bit značí to isté obmedzenie ako preferenciu: hodnota filtruje, čo má UI ponúkať, a nič viac. Z toho vyplývajú dve pasce. Po prvé, /Ff býva vnútri slovníka /SV, nie na widget anotácii, takže kód, ktorý číta /Ff na úrovni poľa, dostáva naveky prázdnu odpoveď a uzavrie, že nič nie je vynútené. Po druhé, pridelenie bitov nie je jednoduchá séria jedna, dva, štyri, osem; v HotPDF emituje writer 2 pre SubFilter, 4 pre MinVersion, 32 pre AddRevInfo a 64 pre DigestMethod. Čítačka, ktorá predpokladá postupné bity, dekóduje každé obmedzenie ako voliteľné a prechádza každým testom okrem toho, ktorý je dôležitý
var
Violation: AnsiString;
begin
// Opýtať sa poľa, či je profil, ktorým sa chystáme podpísať, povolený
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));
// Obmedzenie splnené: pokračovať v podpisovom priebehu
end;
Test, ktorý odhalil pôvodnú chybu dekódovania, nebol pozitívny test. Bola to asercia, že vynútený nesúlad musí byť odmietnutý, a je to jediný druh testu, ktorý dokáže zachytiť túto triedu defektov: dekóder čítajúci zlý slovník alebo zlé pozície bitov produkuje „žiadne obmedzenia neporušené“ pre každý vstup, čo vyzerá presne ako správne správanie, kým zámerne neporušíte jedno
Kde sa to nachádza na rebríku LTV
Štyri príčky a každá potrebuje tú pod sebou. B-B je holý podpis. B-T pridáva dôveryhodnú časovú pečiatku, ktorá fixuje čas podpisu, takže validátor vie, ku ktorému momentu posúdiť revokácie. B-LT pridáva revokačné dôkazy do DSS, čo je to, čo PopulatePAdESLTVEvidence automatizuje. B-LTA pridáva časové pečiatky dokumentu, ktoré sa obnovujú skôr, než predchádzajúca oslabne, čím rozširuje platnosť neurčite; HotPDF to vystavuje ako RenewPAdESLTATimestamp, ktorý pripája novú pečiatku ako inkrementálnu revíziu a ponecháva každý skorší podpis, pečiatku a záznam DSS nedotknuté
Model inkrementálnej aktualizácie je jediný správny spôsob, ako pridať dôkazy do podpísaného dokumentu, pretože prepis súboru by rozbil bajtové rozsahy, ktoré kryjú existujúce podpisy. Ak potrebujete uvažovať o tom, čo sa zmenilo medzi revíziami a či sú tie zmeny toho druhu, ktoré podpis povoľuje, táto analýza je pokrytá osobitne v analýze revízií DocMDP a FieldMDP. Samotná podpisovacia pipeline vrátane zdrojov certifikátov a pascí poradia bajtov je v sprievodcovi podpisovaním PAdES a strana validácie je v overovaní podpisov na načítaných dokumentoch
Jedno praktické varovanie ohľadom poradia. Zbierajte dôkazy čo najskôr po podpise, ideálne v tej istej úlohe. Respondery, ktoré dokážu odpovedať za certifikát, sú online, kým je certifikát aktuálny, a po rokoch sú preč, takže dokument, ktorý opustí vašu pipeline ako B-B, už nemusí byť nikdy upgradovateľný. HotPDF beží ako natívna VCL komponenta pre Delphi a C++Builder a celý priebeh dôkazov je v procese okrem vášho vlastného transportu; podporované profily sú uvedené na produktovej stránke HotPDF Delphi PDF component