Az, hogy eldöntsük, egy PDF aláírás minősített-e az eIDAS szerint, egy olyan kérdés megválaszolását jelenti, amelynek semmi köze a titkosításhoz: a tanúsítványt az bocsátotta-e ki, mint egy megbízhatósági szolgáltatás, amelyet egy tagállam minősített szolgáltatásként vett fel, az aláírás megtételének pillanatában. A válasz egy megbízhatósági listában lakik, egy területenként közzétett XML dokumentumban, és az a dokumentum értéke a hitelességétől függ. Ezért a PDFium komponens megtagadja, hogy belenézzen egyikbe sem, amíg valaki nem szavatolta. A TPdfEuropeanTrustedList.ParseAuthenticated a teljes nyers bájtokat egy hívó által szolgáltatott IPdfTrustedListAuthenticator-nak adja, mielőtt egyetlen szolgáltatást elemzne, és csak akkor hoz létre pillanatfelvételt, ha az a hitelesítő explicit módon elfogad
Az a sorrend a terv. Minden más ebben a funkcióban abból következik, beleértve azokat a részeket is, amelyek kényelmetlennek látszanak
Elemezve nem egyenlő megbízhatóval
Egy tisztán elemzett megbízhatósági lista megmondja, hogy az XML jól formált. Semmit sem mond arról, ki írta. Mivel a lista az, amire a teljes minősített státusz döntése támaszkodik, egy azért elfogadott lista, mert elemezhető, értelmetlenné tenné a döntést: egy támadó, amely a listát kicserélheti, saját tanúsítványhatóságát minősítettnek nyilváníthatja
Ugyanaz az érvelés érvényes a gyorsítótárazásra, és ez az a csapda, amelyet érdemes megnevezni. A pillanatfelvétel-gyorsítótár az eredeti XML-t SHA-256 kivonattal együtt tárolja, és könnyű lenne egy egyező kivonatot a betöltéskor a lista valódiságának bizonyítékaként kezelni. Az nem az. Egy kivonat, amelyet ugyanaz a folyamat számolt, amely a fájlt tárolta, kulcs nélkül, csak azt igazolja, hogy a bájtok nem változtak meg azóta, hogy Ön megírta őket; ha a lista csaló volt, amikor gyorsítótározták, a kivonat megerősíti, hogy ugyanaz a csaló lista. Tehát egy gyorsítótárazott pillanatfelvétel betöltése ugyanazon a hitelesítőn át megy, mint egy friss elemzése. Az integritás és a hitelesség különböző tulajdonságok, és csak az egyik igényel kulcsot
uses
FPdfTrustedList;
type
TListAuthenticator = class(TInterfacedObject, IPdfTrustedListAuthenticator)
public
function Authenticate(const XmlData: TBytes;
out AuthenticationDetails: string): Boolean;
end;
function TListAuthenticator.Authenticate(const XmlData: TBytes;
out AuthenticationDetails: string): Boolean;
begin
// Az Ön politikája itt lakik: ellenőrizze az XMLDSIG burkolt
// aláírását a sávon kívül rögzített listaaláíró tanúsítvánnyal
// szemben, és írja le, mit ellenőrzött az auditnyomvonalhoz
Result := VerifyEnvelopedXmlSignature(XmlData, FPinnedListSigner);
if Result then
AuthenticationDetails := 'XMLDSIG verified against pinned LOTL signer';
end;
var
List: TPdfEuropeanTrustedList;
Cache: TFileStream;
begin
List := TPdfEuropeanTrustedList.ParseAuthenticated(RawXml,
TListAuthenticator.Create, TPdfTrustedListOptions.Default);
// Pillanatfelvétel csak azért létezik, mert a hitelesítő igent mondott
Cache := TFileStream.Create('tl-de.snapshot', fmCreate);
try
List.SaveCache(Cache);
finally
Cache.Free;
end;
end;
A validátor nem birtokolja a hálózati politikát
Egy PAdES validátornak nincs dolga eldönteni, hogyan érje el a megbízhatósági listák listáját, menjen-e proxyn át, milyen gyakran próbálja újra, vagy mit tegyen, amikor egy terület elérhetetlen. Ezek alkalmazás- és telepítési döntések, és szabályozott környezetekben gyakran auditálják őket. Ezért a frissítések a IPdfTrustedListSource útján érkeznek, amely egy URI-t és egy bájtkorlátot kap, és bájtokat ad vissza
Amit a komponens érvényesít, azok az invariánsok, amelyek egy frissítésből frissítést tesznek, nem helyettesítést. Az Update megköveteli, hogy a terület változatlan maradjon, hogy a sorszám szigorúan növekedjen, és hogy a kibocsátási idő ne menjen vissza. Az a három ellenőrzés legyőzi a legnyilvánvalóbb visszaminősítési támadásokat: egy régebbi lista visszajátszását, amely még felsorol egy azóta visszavont szolgáltatást, vagy egy másik terület listájának behelyettesítését, amelynek szolgáltatásaiba soha nem szánta a bizalmát
Elemzői korlátok, és egyáltalán nincs DTD
A TPdfTrustedListOptions korlátot szab az XML méretére, a tokenszámra, a beágyazási mélységre, a szolgáltatások számára, a tanúsítványok számára és egy egyedi tanúsítvány méretére, egy Default osztályfüggvény használható értékeket szolgáltatva. A megbízhatósági listák előre látható méretű közzétett dokumentumok, tehát a határok olcsón állíthatók be, és nincs törvényes lista, amelynek túllépnie kellene rajtuk
Külön és feltétel nélkül az elemző elutasítja a DTD-t és az entitásdeklarációkat. Az egyetlen elutasítás bezárja mind az entitástágítási szolgáltatásmegtagadást, mind a külső entitás felfedési útját, és semmibe sem kerül, mert a megbízhatósági listák nem használnak entitásokat. Bármely, nem megbízható bemenetről elérhető XML elemzőt így kell konfigurálni; az a különbség itt, hogy az elutasítás nem konfigurálható, tehát jótékony opcióváltással nem kapcsolható ki
A minősített státusz a láncbizalom mellett rögzítődik, nem olvad bele
Az értékelési oldal szándékosan külön. A TPadesTrustValidationOptions.QualifiedTrustEvaluator egy IPdfQualifiedTrustEvaluator-t vesz fel, amelyet a megbízhatósági lista pillanatfelvétele implementál. Érvényesítés közben az értékelő megkapja a levéltanúsítványt, a láncot és egy érvényesítési időt, pontos DER összehasonlítással párosítja a szolgáltatási tanúsítványokat az aláíróval és a lánccal, kombinálja a szolgáltatási státuszt, a szolgáltatástípus azonosítóját és a minősítő URI-kat abban az időpontban, és értékelési rekordot ad vissza
Az eredmény két helyen landol minden aláíráson: QualifiedTrustStatus durva státuszként, és QualifiedTrust teljes értékelésként területtel, szolgáltató nevével, szolgáltatás nevével, típusazonosítóval, státusszal és státusz kezdőidővel. Amit nem tesz, az a CertificateTrustStatus megváltoztatása. A rendszer láncbizalma és a minősített státusz különböző kérdésekre válaszol, és egy jelentés, amely összeomlja őket, nem tudja megkülönböztetni a „megbízható, de nem minősített” és a „minősített, de a lánc nem validál” esetét, amelyek mindkettő valós, és mindkettő más kezelést igényel
var
Options: TPadesTrustValidationOptions;
Report: TPadesValidationResult;
I: Integer;
begin
Options := TPadesTrustValidationOptions.Default;
Options.CheckRevocation := True;
Options.QualifiedTrustEvaluator := List; // a hitelesített pillanatfelvétel
Options.QualifiedValidationTime := SigningTime; // nem Now
Report := Pdf.ValidatePadesTrust(Options);
for I := 0 to High(Report.Signatures) do
if Report.Signatures[I].QualifiedTrustStatus = pcsValid then
Writeln(Format('signature %d qualified by %s / %s (%s)',
[I, Report.Signatures[I].QualifiedTrust.Territory,
Report.Signatures[I].QualifiedTrust.ProviderName,
Report.Signatures[I].QualifiedTrust.ServiceName]))
else if Report.Signatures[I].QualifiedTrustStatus = pcsIndeterminate then
// Nincs illeszkedő szolgáltatás, vagy a pillanatfelvétel nem tud felelni erre az időre
Writeln(Format('signature %d: qualified status undetermined', [I]));
end;
Miért nem most az érvényesítési idő
Mert a minősítés egy pillanat tulajdonsága. Egy megbízhatósági szolgáltatás minősített státuszt kaphat, később azt visszavonhatják, és még később helyreállíthatják, és minden átmenet kezdőidőt hordoz a listában. Egy olyan aláírás, amely a szolgáltatás minősített volta közben készült, azután is minősített marad; egy a támogatás előtt készült aláírás visszamenőleg nem válik minősítetté. Az aktuális idővel való értékelés ezért mindkét irányban rossz választ ad
A lista hordozza, ami ehhez kell: minden szolgáltatási rekordnak van státusz kezdőideje és olyan jelzője, amely megkülönbözteti a történelmi bejegyzéseket az aktuálisaktól, és az értékelő azokat az Ön által szolgáltatott idővel szemben kombinálja. A gyakorlatban az az idő a CMS-ben állított aláírási idő helyett az aláírás megbízható időbélyegéből jön, ami az ok, amiért a hosszú távú érvényesítési anyag akkor is számít, amikor a kérdés politikai keresésnek látszik; az időbélyeg és DSS oldalt a hosszú távú aláírási cikk tárgyalja
Mit még Önnek kell megépítenie
Három dolgot, és egyik sem tartozik PDF-könyvtárba. A hitelesítő, azaz valódi XMLDSIG ellenőrzés egy listaaláíró tanúsítvánnyal szemben, amelyet olyan csatornán szerzett, amelyben bízik. A letöltési politika, azaz hogyan és milyen gyakran frissít, és mit tesz az alkalmazása, amikor egy frissítés elbukik. És a területi hatókör, azaz mely listákat cipeli egyáltalán, ami üzleti döntés arról, hogy az Ön üzletfelei mely tagállamokban írnak alá
Amit a komponenstől kap, az az a rész, amelyet finoman el lehet rontani: hitelesítés-elemzés-előtt sorrend, korlátos és entitásmentes XML elemzés, monoton frissítési invariánsok, pontos DER szolgáltatáspárosítás, történelmi státusz értékelés és olyan eredmény, amely külön marad a közönséges láncbizalomtól. Ha az Ön azonnali problémája alapvetőbb, hogy egy validátor elutasít egy olyan aláírást, amelyről Ön hiszi, hogy rendben van, a szokásos okok a miért utasítanak el a validátorok PAdES aláírásokat cikkben vannak katalogizálva, és az aláírásvizsgálati felületet a aláírások és PAdES szintek vizsgálata írja le. A komponens képességei a PDFium Delphi component terméklapon találhatók