Technikai cikk

Hosszú távú PDF aláírások Delphiben: PAdES B-LT és B-LTA

Ahhoz, hogy egy aláírt PDF évek múlva is ellenőrizhető legyen – miután az aláíró tanúsítvány lejár és a CA lecserélődik –, a PDFium Component hosszú távú PAdES aláírásokat képes előállítani Windows-on: egy RFC 3161 időbélyeget a hiteles időhöz, egy Document Security Store-t (DSS), amely beágyazza az ellenőrzési anyagot, valamint egy archív DocTimeStamp időbélyeget a teljes fájlra. Ez a három kiegészítés alkotja a PAdES B-T, B-LT és B-LTA alapvonal-szinteket, és a PDFium Component mindegyiket eléri egyetlen aláírási hívásból. Ez a képesség csak Windows-on érhető el, a PadesCryptoAvailable jelzővel korlátozva

Ez a cikk a harmadik egy sorozatban. Az első, a PDF-ek aláírása PAdES B-B szabvánnyal a PDFium VCL használatával az alapvető aláírást tárgyalja; a második, a PDF digitális aláírások és PAdES szintek vizsgálata az aláírás visszaolvasásával és a szintjének megállapításával foglalkozik. Itt az archívum a fő szempont: olyan aláírások, amelyeknek túl kell élniük a tanúsítvány lejártát, és ellenőrizhetőnek kell maradniuk egy hetek helyett években mért megőrzési időszak alatt

Miért szűnik meg egy érvényes PDF aláírás ellenőrizhetősége az idő múlásával?

Az alapvető aláírás csak egyetlen kérdésre válaszol: megváltoztak-e ezek a bájtok az aláírás után. Önmagában nem bizonyítja, hogy mikor történt az aláírás, és ez a rés az, ami később megtöri az érvényességét. A CMS struktúra tartalmaz egy aláírási idő attribútumot, de az aláíró ezt az értéket a saját órája alapján írja be, így az ellenőrzőnek nincs oka bízni benne. Ha a tanúsítvány később lejár vagy a CA visszavonja azt, a szigorú ellenőrző már nem tudja megkülönböztetni a tanúsítvány érvényessége alatt készült aláírást a lejárt tanúsítvánnyal hamisítottól. Az aláírás a készítés napján rendben volt, és nem a saját hibájából válik ellenőrizhetetlenné

A hosszú távú archiválás ezt két lépéssel oldja meg. Elsőként egy megbízható harmadik fél, egy időbélyegző hatóság (TSA) kriptográfiailag igazolja az időt, így az már nem függ az aláíró becsületességétől. Másodszor, a bizalmi lánc felépítéséhez és ellenőrzéséhez szükséges minden tanúsítvány, visszavonási válasz és CRL be van ágyazva magába a PDF-be, így az ellenőrzés nem függ olyan szerverektől, amelyek már eltűnhettek, mire bárki megnézné. Az ETSI EN 319 142-1 szabványban rögzített PAdES ezeket alapvonal-szintekként rétegezi, a PDFium Component pedig megírja az egyes szintek által megkövetelt struktúrákat

Mi az az LTV or archív időbélyeges PDF aláírás?

A PAdES négy egymásra épülő alapvonali szintet határoz meg, és a PDFium Component a TPadesLevel felsoroláson keresztül teszi elérhetővé őket (plB_B, plB_T, plB_LT, plB_LTA). A B-B a sima aláírás. A B-T egy megbízható időbélyeget ad az aláírás értékéhez. A B-LT (long-term) beágyazza az ellenőrzési anyagot – ez az a tulajdonság, amit a legtöbben az „LTV” alatt értenek. A B-LTA (hosszú távú, archív időbélyeggel) mindent beburkol még egy időbélyegzővel, amely a teljes fájlt lefedi, így a beágyazott anyag maga is bizonyíthatóan érintetlen az archiválás pillanatától kezdve

A gyakorlati olvasat egy lépcsősor. A B-T bizonyítja, hogy *mikor*. A B-LT bizonyítja, hogy *mivel* ellenőrizhető még az aláírás. A B-LTA bizonyítja, hogy a teljes csomagot nem manipulálták a lezárása óta, és ez az a szint, amelyet meg kell újítani egy friss DocTimeStamp hozzáadásával, mielőtt az előző lejárna, hogy az archívumot korlátlan ideig meghosszabbítsa. Hosszú megőrzési kötelezettséggel bíró szerződések vagy megfelelőségi rekordok esetében a B-LTA a cél; a B-LT a pragmatikus minimum

Megbízható idő hozzáadása: PAdES B-T az RFC 3161-gyel

A PDFium Component a B-B aláírást B-T-vé alakítja a TPadesSignOptions két mezőjének beállításával: emelje a Level-t plB_T-re, és adja meg a TsaUrl-t. Ha mindkettő jelen van, az aláírási folyamat lehasheli a nyers aláírási bájtokat SHA-256 algoritmussal, bepakolja ezt a kivonatot RFC 3161 messageImprint-ként, elküldi (POST) a kérést a TSA-nak WinHttp-n keresztül, és a kapott tokent beágyazza signature-time-stamp aláíratlan attribútumként (OID 1.2.840.113549.1.9.16.2.14) a SignerInfo unsignedAttrs [1] mezőjébe, az EN 319 142-1 szabvány 6.3-as pontja szerint. Az időbélyeg kifejezetten az aláírás értékét fedi le, ez köti a megbízható időt pontosan ehhez az aláíráshoz

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;

A CertificateThumbprint a tanúsítvány SHA-1 hashértéke hexadecimálisan az aktuális felhasználó „MY” tárából, amelynek privát kulcsát használni tudja. A Nonce mező az RFC 3161 visszajátszás-elleni (anti-replay) értéke; hagyja nullán, és a komponens egy egyedi értéket származtat kérésenként egy számláló, az óra, az ütem számláló és a folyamatazonosító SHA-256 hajtogatásából, így két, ugyanazon ezredmásodpercben kiadott kérés nem ütközik. Csak akkor adjon meg saját értéket, ha megbízhatóbb kriptográfiai RNG-vel rendelkezik. Egy őszinte figyelmeztetés: a B-T-nek elérhető TSA-ra van szüksége, így az aláírás most hálózati hívást kezdeményez, és örökli a TSA elérhetőségét és késleltetését

Ellenőrzési anyag beágyazása: B-LT és B-LTA egyetlen hívásban

A hosszú távú ellenőrzés felé vezető lépés egyetlen változtatás: állítsa a Level-t plB_LTA-ra, és tartsa meg a TsaUrl-t. A PDFium Component ekkor a teljes lépcsősort lefutja egyetlen SignPades hívásban. Aláírja a B-B-t, időbélyegzi a B-T-hez, beilleszti a Document Security Store-t a B-LT-hez, és hozzáfűzi az archív időbélyeget a B-LTA-hoz, mindegyiket saját inkrementális frissítésként, így a korábbi bájtok bájtról bájtra érintetlenek maradnak

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;

A B-LT szakaszhoz a PDFium Component felépíti a tanúsítványláncot a CertGetCertificateChain segítségével, és ír egy /DSS szótárt, amely az aláíró tanúsítványát és minden köztes CA-t tartalmaz egy /Certs tömbben (párhuzamos /OCSPs és /CRLs tömbökkel), valamint egy Level 1-es /Extensions /ESIC jelölőt, pontosan az EN 319 142-1 §5.4.2 előírása szerint. Az ön-aláírt gyökér (self-signed root) szándékosan ki van hagyva, mivel az RFC 5652 §10.2.3 engedélyezi ezt, és a gyökér már eleve egy olyan bizalmi horgony (trust anchor), amelyet az ellenőrző birtokol. Az eredmény egy olyan aláírás, amelyet az olvasó kizárólag a kezében lévő fájl segítségével is ellenőrizni tud

A B-LTA-hoz a komponens hozzáfűz egy dokumentum-időbélyeget: egy aláírási szótárt /SubFilter /ETSI.RFC3161 értékkel, amelynek /ByteRange-e a teljes fájlt átfogja, a /Contents pedig egy RFC 3161 tokent tartalmaz a tartomány felett, és a Level 2-re lépteti elő az ESIC jelölőt. Ez az §5.4.3 és a TS 119 142-3 szerinti archiválási lépés. Mivel a DocTimeStamp a DSS-t és az aláírást is lefedi, bizonyítja, hogy a beágyazott ellenőrzési anyag jelen volt és változatlan maradt az archiválás pillanatában, ami pontosan az, amit egy hosszú távú megőrzési szabályzatnak be kell tudnia mutatni

Már meglévő aláírás kiegészítése

Néha az aláírás már rajta van a dokumentumon, és Önnek csak hozzá kell adnia vagy frissítenie kell az ellenőrzési tárat (validation store), például egy harmadik fél által készített B-B aláírás B-LT szintre emeléséhez az archívumában. A PDFium Component a DSS injektort közvetlenül a SaveAsPadesDss metóduson keresztül teszi elérhetővé, amely inkrementális frissítésként fűzi hozzá a /DSS és /Extensions struktúrákat anélkül, hogy megérintené a meglévő aláírásbájtokat

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;

Ön megadja a DER-kódolású tanúsítványokat, és opcionálisan az OCSP válaszokat és CRL-eket, amelyekre az ellenőrzőnek szüksége lesz. Állítsa az EsicExtensionLevel-t 1-re a B-LT tárhoz, vagy 2-re, ha DocTimeStamp fogja követni. Hagyja az IncludeVri-t az alapértelmezett False értéken: az EN 319 142-1 §5.4.2.3 szabványpont opcionálisként kezeli az aláírásonkénti /VRI szótárt, és ellenzi a használatát, hacsak egy konkrét célzott olvasó meg nem követeli azt

Költségek és határok, amelyekkel érdemes tervezni

Három őszinte korlát határozza meg, hogy ezek a szintek hová illeszkednek. Elsőként, a kriptográfiai háttér csak Windows-on érhető el: az aláírás és az időbélyegzés a platform CNG és WinHttp tárain keresztül történik, így a PadesCryptoAvailable máshol False-t ad vissza, a SignPades pedig hibát jelez. A kísérő cikkben tárgyalt olvasási oldali vizsgálat platformfüggetlen marad; csak az aláírások írása kötődik a Windows-hoz. Másodszor, a B-T és B-LTA szintek időbélyegző hatóságtól (TSA) függenek, ami hálózati oda-vissza utat jelent az aláírás idején, és egy külső szolgáltatást, amelynek rendelkezésre állása és sebességkorlátai az aláírási útvonal részévé válnak

Harmadszor, minden szint tárhelybe kerül. Minden szakasz inkrementális frissítést fűz hozzá ahelyett, hogy átírná a fájlt, a DSS beágyaz egy teljes tanúsítványláncot, az archív DocTimeStamp pedig helyet foglal a tokenjének, így a B-LTA fájl jelentősen nagyobb, mint a B-B eredeti. Ez egy tudatos kompromisszum: most bájtokat költ a későbbi ellenőrizhetőség megvásárlására. A legtöbb szerződés és megfelelőségi archívum esetében ez a megfelelő üzlet, de érdemes letesztelni a saját dokumentumain a feltételezés helyett. Ha meg kell győződnie arról, hogy egy elkészült fájl valóban elérte a kívánt szintet, ellenőrizze azt a PDF digitális aláírások és PAdES szintek vizsgálata cikk technikáival, és ha szélesebb körben erősíti meg a dokumentum-csatornáját, a PDF biztonsági kockázatainak auditálásáról szóló jegyzetek lefedik a kapcsolódó ellenőrzéseket

Az itt bemutatott PAdES aláírás, DSS és archív időbélyegző funkciók a Delphi és C++Builder rendszerekhez készült PDFium Component részei, amelynek termékoldala tartalmazza a teljes aláírási referenciát és a platformkövetelményeket