Handleiding

PAdES-valkuilen

Alles hieronder is een document met een geldige handtekening en een lezer die iets anders ziet dan er is ondertekend, of de handtekening helemaal niet ziet. Validators zwijgen erover, want de cryptografie is in orde. We zien ze allemaal in bestanden die klanten ons sturen; de eerste kwam binnen in de week dat deze gids werd geschreven. De PDF-analyser op deze site meldt ze onder Findings.

De fix zit altijd in de voorbereiding, voor de eerste handtekening; "Het document voorbereiden" is de checklistvorm van deze lijst. Na het ondertekenen is een wijziging hierin een wijziging van het document, en Adobe meldt dat.

/NeedAppearances true op een ondertekend formulier

Wat. De AcroForm-dictionary heeft /NeedAppearances true. Formulierinvullers laten dat staan zodat een viewer de weergave van elk veld uit zijn waarde opnieuw opbouwt bij het openen.

Effect. Adobe Acrobat en Reader bouwen alle veldweergaven opnieuw op, inclusief de ondertekende handtekeningvelden, en laten die vallen; het document lijkt onondertekend in Adobe terwijl een validator, Nitro, PDFium en Poppler de handtekening allemaal tonen. Twee mensen die naar hetzelfde bestand kijken zijn het oneens over of het ondertekend is.

Fix. Zet /NeedAppearances op false of haal hem weg voor het ondertekenen, of sla het formulier plat. De ingevulde velden hebben al appearance streams, dus visueel verandert er niets. Een bestand dat dit al heeft, is niet te repareren zonder een wijziging na ondertekening.

Invulvelden die invulbaar blijven

Wat. Tekst-, keuze- of vinkvelden zonder de read-only-vlag (/Ff bit 1) en niet gedekt door een FieldMDP-lock of een DocMDP-certificering met P=1.

Effect. Een waarde wijzigen na het ondertekenen is "form filling" in het PDF-model. Elke handtekening blijft geldig, elke validator zegt dat, en het zichtbare document zegt niet meer wat er is ondertekend. Een BSN, een datum of een bedrag is aanpasbaar onder een geldige gekwalificeerde handtekening.

Fix. Maak de velden read-only of sla het formulier plat voor het ondertekenen. Een FieldMDP-lock (/Lock << /Action /All >> op het handtekeningveld) is een goede aanvulling. Gebruik geen DocMDP P=1 als je later nog een tijdstempel of DSS wilt toevoegen; dat verbiedt ze.

De handtekening staat niet in /AcroForm /Fields

Wat. Een signature dictionary die aan een pagina-annotatie hangt, of aan niets, zonder veld in de AcroForm-veldboom dat ernaar wijst. Ook: een document met handtekeningen en helemaal geen AcroForm.

Effect. Acrobat vindt handtekeningen via de veldboom. Wat daar niet in staat, ontbreekt in zijn handtekeningpaneel; een validator die objecten aflooopt vindt hem wel.

Fix. Registreer het veld in /AcroForm /Fields, zet zijn widget in de /Annots van de pagina, en zet /SigFlags 3 (handtekeningen bestaan, alleen aanvullen).

/SigFlags zonder bit 2

Wat. /SigFlags 1 of afwezig.

Effect. Een viewer die het bestand opslaat kan het herschrijven in plaats van een revisie aanvullen. Dat vernietigt de handtekening.

Fix. /SigFlags 3.

Widget op geen enkele pagina, of verborgen

Wat. Een handtekeningveld met een weergave maar zonder widget in de /Annots van een pagina; of een widget met de annotatievlag Hidden of NoView.

Effect. De handtekening bestaat en staat in de lijst, maar er wordt niets getekend waar de gebruiker een handtekeningblok verwacht.

Fix. Voeg de widget toe aan de pagina waar hij hoort; haal de vlaggen weg. Een bewust onzichtbare handtekening (helemaal geen weergave) is prima en komt vaak voor; beslis het alleen met opzet.

Bytes na de laatste handtekening

Wat. Een incrementele update na de laatste handtekening of documenttijdstempel, waardoor de staart van het bestand door niets wordt gedekt.

Effect. Is de update een DSS of een latere tijdstempel, dan onschuldig. Wijzigt hij inhoud, annotaties of veldwaarden, dan meldt Adobe "gewijzigd na ondertekening" en kan de lezer iets zien dat niet is ondertekend.

Fix. Niets na de laatste tijdstempel. Bij B-LTA is de archieftijdstempel per definitie het laatste in het bestand.

DocMDP P=1 op een document dat je wilt uitbreiden

Wat. Een certificeringshandtekening die geen wijzigingen toestaat.

Effect. Een DSS of een documenttijdstempel later toevoegen, wat B-LT en B-LTA vereisen, is een verboden wijziging.

Fix. P=2 als je certificeert en wilt uitbreiden, of certificeer niet en gebruik FieldMDP voor de velden.

Te weinig ruimte in /Contents

Wat. De gereserveerde /Contents is op maat van een kale handtekening; de CMS met de keten, of met een tijdstempeltoken, past niet.

Effect. Het afmaken mislukt nadat de ondertekenaar al heeft geautoriseerd. Opnieuw proberen betekent een nieuwe autorisatie.

Fix. Reserveer ruim bij het voorbereiden, en weet waarvoor de reservering is. De /Contents van de handtekening bevat de signed attributes, de handtekeningwaarde, de certificaatketen en bij B-T het tijdstempeltoken: ruwweg 4 kB voor een kale B-B met drie certificaten, 8 tot 10 kB zodra er een tijdstempeltoken in zit.

B-LT en B-LTA vragen niets extra in dat veld. De revocatiegegevens gaan naar een /DSS-dictionary in een eigen revisie, en elke documenttijdstempel is een nieuw veld met zijn eigen /Contents, met daarin een kale TimeStampToken plus de keten van de TSA: ongeveer 4 tot 8 kB. Geef die ook een maat, en bedenk dat elke LTA-verlenging er weer een toevoegt. Onze eigen ondertekenservice gebruikt één ruim getal voor beide, 32768 bytes: te veel reserveren kost alleen bestandsgrootte, te weinig mislukt nadat de ondertekenaar al heeft geautoriseerd.

Een DSS met alleen certificaten

Wat. Een /DSS-dictionary met de certificaten van de ketens maar zonder /OCSPs, zonder /CRLs en zonder /VRI, vaak gevolgd door documenttijdstempels.

Effect. Het bestand lijkt B-LT of B-LTA en is B-T. Validators melden B-T; Acrobat toont geen "LTV enabled". Zodra de endpoints van de CA verdwijnen, is de handtekening niet meer te valideren, wat de tijdstempels ook zeggen.

Fix. Haal OCSP-responses of CRL's op voor elk certificaat in beide ketens ná de tijdstempel, schrijf ze in de DSS met een /VRI per handtekening, en voeg dan pas de documenttijdstempel toe.

XFA naast de AcroForm

Wat. Het formulier heeft een /XFA-sleutel.

Effect. Adobe rendert het XFA-formulier, elke andere viewer de AcroForm-weergaven; het zichtbare document verschilt per viewer.

Fix. Verwijder de XFA of sla plat voor het ondertekenen.

Dit alles in één keer nakijken

Haal het voorbereide, nog onondertekende document door een inspector voor de eerste handtekening. De PDF analysis van Cleverbase meldt NeedAppearances en open velden als "attention" op een onondertekend document, dus je vangt ze waar ze nog goedkoop te herstellen zijn; met de hand kijk je naar de AcroForm-dictionary en naar de /Ff en /AP van elk veld.