Om een ondertekende PDF over enkele jaren nog te kunnen verifiëren, nadat het handtekeningcertificaat is verlopen en de CA is geroteerd, kan de PDFium Component langdurige PAdES-handtekeningen genereren op Windows: een RFC 3161 timestamp voor vertrouwde tijd, een Document Security Store waarin het validatiemateriaal is ingebed, en een archief-DocTimeStamp over het gehele bestand. Deze drie toevoegingen zijn de PAdES B-T, B-LT en B-LTA basisniveaus, en de PDFium Component bereikt ze allemaal met één enkele ondertekeningsaanroep. Dit is een functionaliteit die alleen voor Windows beschikbaar is en wordt beheerd door PadesCryptoAvailable
Dit artikel is het derde in een serie. Het eerste artikel, PDF's ondertekenen met PAdES B-B met PDFium VCL, behandelt de basishandtekening; het tweede artikel, PDF digitale handtekeningen en PAdES-niveaus inspecteren, behandelt het teruglezen van een handtekening en het bepalen welk niveau is bereikt. Hier ligt de focus op het archief: handtekeningen die het verloop van certificaten moeten overleven en verifieerbaar moeten blijven voor een bewaarperiode die in jaren wordt gemeten, niet in weken
Waarom stopt een geldige PDF-handtekening na verloop van tijd met verifiëren?
Een basishandtekening beantwoordt slechts één vraag: zijn deze bytes na het ondertekenen gewijzigd. Ze bewijst op zichzelf niet wanneer de ondertekening heeft plaatsgevonden, en dat gemis is wat haar later parten speelt. De CMS-structuur bevat een 'signing-time'-attribuut, maar de ondertekenaar schrijft die waarde op basis van zijn eigen klok, dus een validator heeft geen reden om deze te vertrouwen. Wanneer het ondertekeningscertificaat later verloopt of de CA het intrekt, kan een strikte validator geen onderscheid meer maken tussen een handtekening die is gezet toen het certificaat nog geldig was en een handtekening die is vervalst nadat het certificaat was verlopen. De handtekening was in orde op de dag dat ze werd gezet, maar wordt buiten haar schuld om onverifieerbaar
Langdurige archivering lost dit in twee stappen op. Ten eerste bevestigt een vertrouwde derde partij, een Time Stamping Authority (TSA), de tijd cryptografisch, zodat deze niet langer afhankelijk is van de eerlijkheid van de ondertekenaar. Ten second, wordt elk certificaat, elke intrekkingsreactie en elke CRL die nodig is om de vertrouwensketen op te bouwen en te controleren, ingebed in de PDF zelf. Hierdoor is de validatie niet afhankelijk van servers die mogelijk al verdwenen zijn tegen de tijd dat iemand de handtekening controleert. PAdES, gestandaardiseerd als ETSI EN 319 142-1, structureert deze als basisniveaus, en de PDFium Component schrijft de structuren die elk niveau vereist
Wat is een LTV- of archieftimestamp PDF-handtekening?
PAdES definieert vier basisniveaus die op elkaar voortbouwen, en de PDFium Component stelt deze beschikbaar via de TPadesLevel opsomming (plB_B, plB_T, plB_LT, plB_LTA). B-B is the gewone handtekening. B-T voegt een vertrouwde timestamp toe over de waarde van de handtekening. B-LT (long-term) voegt het ingebedde validatiemateriaal toe, de eigenschap die de meeste mensen bedoelen met "LTV". B-LTA (long-term met archieftimestamp) omhult alles met nog een timestamp die het gehele bestand beslaat, zodat het ingebedde materiaal zelf aantoonbaar intact is vanaf het moment van archiveren
In de praktijk is het een stappenplan. B-T bewijst wanneer. B-LT bewijst waarmee de handtekening nog steeds kan worden gecontroleerd. B-LTA bewijst dat er niet met het hele pakket is geknoeid sinds het is verzegeld, en dit is het niveau dat u vernieuwt door een nieuwe DocTimeStamp toe te voegen voordat de vorige verloopt om het archief voor onbepaalde tijd te verlengen. Voor een contract of een nalevingsdossier met een lange bewaarplicht is B-LTA het doel; B-LT is de pragmatische ondergrens
Vertrouwde tijd toevoegen: PAdES B-T met RFC 3161
De PDFium Component zet een B-B handtekening om in een B-T handtekening door twee velden in te stellen op TPadesSignOptions: verhoog Level naar plB_T en geef een TsaUrl op. Wanneer beide aanwezig zijn, hasht de ondertekeningspipeline de ruwe handtekening-octets met SHA-256, verpakt die digest als de RFC 3161 messageImprint, stuurt de aanvraag via een POST naar de TSA over WinHttp, en bedt het geretourneerde token in als het ongetekende attribuut signature-time-stamp (OID 1.2.840.113549.1.9.16.2.14) in de SignerInfo unsignedAttrs [1], conform EN 319 142-1 §6.3. De timestamp dekt specifiek de handtekeningwaarde af, wat de vertrouwde tijd koppelt aan die exacte handtekening
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;
De CertificateThumbprint is de SHA-1 hash, in hexadecimaal formaat, van een certificaat in de Current User "MY" store waarvan u de privésleutel kunt gebruiken. Het veld Nonce is de RFC 3161 anti-replay waarde; laat dit op nul staan en de component leidt per aanvraag een unieke waarde af uit een SHA-256 fold van een teller, de klok, de tick count en het proces-id, zodat twee aanvragen die in dezelfde milliseconde worden ingediend niet botsen. Geef alleen uw eigen waarde op als u een cryptografische RNG hebt die u liever vertrouwt. Een belangrijk voorbehoud: B-T vereist een bereikbare TSA, dus ondertekenen voert nu een netwerkaanroep uit en is afhankelijk van de beschikbaarheid en latentie van de TSA
Validatiemateriaal inbedden: B-LT en B-LTA in één aanroep
De overstap naar langdurige validatie is een enkele wijziging: stel Level in op plB_LTA en behoud de TsaUrl. De PDFium Component doorloopt vervolgens het volledige stappenplan binnen één SignPades aanroep. Het ondertekent B-B, timestamps voor B-T, injecteert de Document Security Store voor B-LT en voegt de archieftimestamp toe voor B-LTA, elk als een eigen incrementele update zodat de eerdere bytes byte-voor-byte intact blijven
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;
Voor de B-LT-fase bouwt de PDFium Component de certificaatketen op met CertGetCertificateChain en schrijft een /DSS dictionary die het certificaat van de ondertekenaar bevat plus elke tussenliggende CA in een /Certs array (met parallelle /OCSPs en /CRLs arrays), samen met een /Extensions /ESIC marker op Niveau 1, precies zoals EN 319 142-1 §5.4.2 voorschrijft. De zelfondertekende root-CA is bewust weggelaten, aangezien RFC 5652 §10.2.3 dit toestaat en de root-CA al een trust anchor is dat de validator bezit. Het resultaat is een handtekening die een lezer kan verifiëren met niets anders dan het bestand zelf
Voor B-LTA voegt de component een Document Time-stamp toe: een signature-dictionary met /SubFilter /ETSI.RFC3161 waarvan de /ByteRange het gehele bestand beslaat, met in /Contents een RFC 3161 token over dat bereik, en verhoogt de ESIC-marker naar Niveau 2. Dit is de archiveringsstap conform §5.4.3 en TS 119 142-3. Omdat de DocTimeStamp zowel de DSS als de handtekening dekt, bewijst het dat het ingebedde validatiemateriaal aanwezig en ongewijzigd was op het moment van archiveren, wat precies is wat een langetermijn-bewaarbeleid moet kunnen aantonen
Een bestaande handtekening uitbreiden
Soms staat de handtekening al op het document en hoeft u alleen de validatiestore toe te voegen of te vernieuwen, bijvoorbeeld om een externe B-B handtekening op te waarderen naar B-LT voor uw archief. De PDFium Component stelt de DSS-injector rechtstreeks beschikbaar via SaveAsPadesDss, die de /DSS en /Extensions structuren toevoegt als een incrementele update zonder de bestaande handtekeningbytes aan te raken
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;
U levert de DER-gecodeerde certificaten, en optioneel OCSP-reacties en CRL's, die een validator nodig zal hebben. Stel EsicExtensionLevel in op 1 voor een B-LT store of op 2 wanneer een DocTimeStamp zal volgen. Laat IncludeVri op de standaardwaarde False staan: EN 319 142-1 §5.4.2.3 behandelt de /VRI dictionary per handtekening als optioneel en raadt dit af, tenzij een specifieke lezer die u op het oog hebt dit vereist
Kosten en grenzen om rekening mee te houden
Drie duidelijke beperkingen bepalen waar deze niveaus passen. Ten eerste is de cryptografische backend alleen voor Windows: ondertekenen en timestamping verlopen via de CNG- en WinHttp-stores van het platform, dus PadesCryptoAvailable retourneert elders False en SignPades genereert een foutmelding. De inspectie aan de leeszijde die in het begeleidende artikel wordt behandeld, blijft platformonafhankelijk; alleen het schrijven van handtekeningen is gebonden aan Windows. Ten tweede zijn B-T en B-LTA afhankelijk van een Time Stamping Authority, wat een netwerk-roundtrip op het moment van ondertekenen betekent en een externe service waarvan de uptime en tarieflimieten deel gaan uitmaken van your ondertekeningstraject
Ten derde brengt elk niveau opslagkosten met zich mee. Elke fase voegt een incrementele update toe in plaats van het bestand te herschrijven, de DSS bedt een volledige certificaatketen in, en de archief-DocTimeStamp reserveert ruimte voor zijn token, waardoor een B-LTA-bestand aanzienlijk groter is dan het origineel in B-B. Dat is de bewuste afweging: u investeert nu bytes om later verifieerbaarheid te garanderen. Voor de meeste contract- en nalevingsarchieven is dit de juiste afweging, maar het is de moeite waard om dit op uw eigen documenten te meten in plaats van ervan uit te gaan. Wanneer u moet bevestigen of een voltooid bestand daadwerkelijk het gewenste niveau heeft bereikt, kunt u dit verifiëren met de technieken in PDF digitale handtekeningen en PAdES-niveaus inspecteren. Als u een documentenpipeline breder wilt beveiligen, behandelen de notities over PDF-veiligheidsrisico's auditeren de relevante controles
De hier getoonde PAdES-ondertekening, DSS en archieftimestamp-functies maken deel uit van de PDFium Component voor Delphi en C++Builder, waarvan de productpagina de volledige referentie voor ondertekening en de platformvereisten bevat