Beveiliging / Ondertekenen: CMS, RFC 3161-tijdstempel, LTV, vertrouwen
In een oogopslag
Sectie met titel “In een oogopslag”Deze pagina beschrijft het ondertekeningsoppervlak van NextPDF Core: het produceren van een Content Management Syntax-handtekening (CMS), het toepassen van een Request for Comments (RFC) 3161-tijdstempel, het valideren van een certificaatketen volgens RFC 5280 en het controleren van intrekking via het Online Certificate Status Protocol (OCSP) en een certificaatintrekkingslijst (CRL). De pagina blijft bij het gedragsniveau. De implementatieklassen van Core zijn intern: productiecode gebruikt het SignerInterface-contract, niet de concrete NextPDF\Security\Signature-typen. De verifier en de daarop geconfigureerde vertrouwensankers bepalen of een geproduceerde handtekening verifieert. De producent heeft geen controle over die uitkomst, en deze pagina benoemt dat waar het ertoe doet.
Installeren
Sectie met titel “Installeren”composer require nextpdf/core:^3Conceptueel overzicht
Sectie met titel “Conceptueel overzicht”Core bouwt uit het bytebereik een CMS SignedData-structuur op en slaat die vervolgens op als Distinguished Encoding Rules (DER)-gecodeerde gegevens in de Contents-vermelding van het handtekeningwoordenboek — ISO 32000-2 §12.8.1. De structuur bevat ondertekende SignerInfo-attributen, waaronder content-type en message-digest — RFC 5652 §5.3. Een verifier herberekent het samenvattingscijfer van de inhoud en vergelijkt dit met het message-digest-attribuut. Die vergelijking moet slagen om de handtekening geldig te laten zijn — RFC 5652 §5.4. SignerInfo bevat ook de aanduiding van het samenvattingsalgoritme en het blok met ondertekende attributen — RFC 5652 §5. Core gebruikt phpseclib3 voor de meegeleverde softwarematige ondertekeningspaden: RSA, RSASSA-PSS, ECDSA en Ed25519.
Een RFC 3161-tijdstempel is een aanvraag-antwoorduitwisseling met een Time-Stamping Authority (TSA) die een TSTInfo-structuur retourneert — RFC 3161 §2.4.1. Elk token bevat een serialNumber die uniek is voor de uitgevende TSA — RFC 3161 §2.4.2 — en een genTime, uitgedrukt als Coordinated Universal Time (UTC), voor het moment waarop het token is aangemaakt — RFC 3161 §2.4.2.
Vertrouwensvalidatie bestaat uit twee controles. Padvalidatie loopt van het certificaat van de ondertekenaar naar een vertrouwensanker en controleert daarbij de basisbeperkingen en de invoer voor de padconstructie — RFC 5280 §6.1. Intrekkingscontrole bevraagt een OCSP-responder of leest een CRL: een OCSP-antwoord meldt good, revoked of unknown — RFC 6960 §2.2 — en de thisUpdate en nextUpdate van het antwoord begrenzen hoe actueel die status is — RFC 6960 §4.2. De aanroeper levert de vertrouwensankers en het versheidsbeleid voor intrekking. De engine valideert op basis van die invoer en levert geen ingebouwde vertrouwenslijst mee.
API-oppervlak
Sectie met titel “API-oppervlak”| Type | Soort | Rol | Stabiliteit | Sinds |
|---|---|---|---|---|
SignerInterface | interface (NextPDF\Contracts) | Het ondertekeningscontract waarvan aanroepers afhankelijk zijn | stabiel | 1.0.0 |
SignatureLevel | enum | Niveauselector en beschikbaarheidsprobe voor PDF Advanced Electronic Signatures (PAdES) | stabiel | 1.0.0 |
Rfc5280PathValidator | interface | Toegangspunt voor validatie van het certificeringspad (validate(...)) | stabiel (bevroren 3.1.0) | 3.1.0 |
RevocationStatus | enum | OCSP / CRL-uitkomst: good, revoked, unknown | stabiel | 3.1.0 |
CaTrustAnchorBundle | type | Door de aanroeper geleverde verzameling vertrouwensankers | stabiel | 3.1.0 |
TstInfo | type | Geparseerde RFC 3161-tijdstempelvelden | stabiel | 3.2.0 |
SignerInterface::sign() retourneert een SignatureResult. De methode toHex() levert de /Contents-hexstring op, en de eigenschap cmsSignedData bevat de ruwe DER-bytes. De concrete NextPDF\Security\Signature-klassen die dit gedrag implementeren, zijn intern (stability: internal in het modulemanifest). Ze maken geen deel uit van de publieke API en kunnen wijzigen zonder ophoging van de hoofdversie. Gebruik de contracten en enums hierboven als basis.
Codevoorbeeld — Snelstart
Sectie met titel “Codevoorbeeld — Snelstart”<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Contracts\SignerInterface;
/** * Produce the CMS SignedData hex for a PDF /Contents field. * * @param SignerInterface $signer A Core or Premium signer. * @param string $byteRange The PDF byte range to sign. * * @return string Hex-encoded CMS SignedData. */function sign(SignerInterface $signer, string $byteRange): string{ return $signer->sign($byteRange)->toHex();}De aanroeper hangt alleen af van het contract. Een softwarematige ondertekenaar van Core en een Premium Hardware Security Module-ondertekenaar (HSM) voldoen allebei aan SignerInterface, waardoor deze code niet verandert tussen edities.
Codevoorbeeld — Productie
Sectie met titel “Codevoorbeeld — Productie”<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Contracts\SignerInterface;use NextPDF\Contracts\TimestampProviderInterface;use NextPDF\Exception\NextPdfException;use Psr\Log\LoggerInterface;
final readonly class TimestampedSigner{ public function __construct( private SignerInterface $signer, private TimestampProviderInterface $timestamps, private LoggerInterface $logger, ) {}
/** * Sign a byte range, then timestamp the CMS structure. * * The timestamp's trust still depends on the verifier accepting the * Time-Stamping Authority; this method only produces the structure. * * @param string $byteRange The PDF byte range to sign. * * @return array{cms: string, tst: string} */ public function sign(string $byteRange): array { try { $signature = $this->signer->sign($byteRange); $token = $this->timestamps->getTimestamp($signature->cmsSignedData);
return ['cms' => $signature->toHex(), 'tst' => $token]; } catch (NextPdfException $e) { $this->logger->error('Signing failed', ['error' => $e->getMessage()]);
throw $e; } }}De tijdstempelprovider wordt geïnjecteerd, zodat een deployment zijn eigen Time-Stamping Authority kan vastleggen. Het catch-blok logt de fout en gooit deze opnieuw. Het slikt de fout nooit in, waardoor het ondertekeningspad fail-closed blijft.
Randgevallen en valkuilen
Sectie met titel “Randgevallen en valkuilen”- Een geproduceerde handtekening is geen geverifieerde handtekening. Padvalidatie en intrekking vinden plaats bij de verifier en gebruiken de vertrouwensankers van die verifier. De producent kan het resultaat niet bevestigen.
- Het samenvattingscijfer over het bytebereik sluit de handtekeningwaarde uit. Een samenvattingscijfer dat de
Contents-octetten omvat, kan niet worden geverifieerd — ISO 32000-2 §12.8.1. - Intrekkingsstatus heeft een versheidsvenster. Een OCSP-antwoord is alleen actueel binnen zijn
thisUpdate/nextUpdate-interval — RFC 6960 §4.2. Een verouderd antwoord is geen vervanging voor een verse controle op het moment van validatie. - De engine levert geen ingebouwde vertrouwenslijst mee.
CaTrustAnchorBundlewordt door de aanroeper geleverd; een lege bundel betekent zoals bedoeld dat geen enkele keten valideert. - OCSP
unknownis nietgood. Behandelunknownals een onbesliste status, niet als een impliciete goedkeuring — RFC 6960 §2.2. - HSM-sleutelbeheer, uitgesteld ondertekenen en cloudondertekenen, en de PAdES B-LT / B-LTA-producent zitten niet in Core. Het selecteren van die paden in de Core-distributie mislukt fail-closed met een bericht dat het ontbrekende Enterprise-onderdeel benoemt.
Prestaties
Sectie met titel “Prestaties”Een softwarematige handtekening kost enkele milliseconden. Een tijdstempel voegt één netwerkrondgang naar de TSA toe. Padvalidatie verloopt lokaal zodra de certificaten in het geheugen staan; intrekking voegt één OCSP- of CRL-ophaling toe per certificaat in de keten. Het wandbudget van 1500 ms dekt één handtekening met tijdstempel met een externe TSA op een warme verbinding. Intrekking via een traag eindpunt overschrijdt dat budget en hoort buiten het verzoekpad thuis. Het reproduceerbaarheidsprofiel is structural: een tijdstempel bevat het ondertekeningsmoment, waardoor twee runs verschillen in de tijdstempelbytes terwijl de documentstructuur identiek is.
Beveiligingsnotities
Sectie met titel “Beveiligingsnotities”Dit is de primaire cryptografische grens van de engine, dus het dreigingsmodel is expliciet. De engine berekent het bytebereik en aanvaardt het nooit van de aanroeper. Het ondertekeningspad is fail-closed: een falen van een primitief of een ontbrekende capaciteit werpt een getypeerde uitzondering op en degradeert nooit stilzwijgend naar een zwakker algoritme. Op een niveau waarvoor een tijdstempel vereist is (B-T, B-LT, B-LTA), is een Time-Stamping Authority die een leeg token retourneert een terminale fout: de handtekening wordt geweigerd. Ze wordt niet uitgegeven in een stilzwijgend niet-getijdstempelde, naar beneden bijgestelde toestand, tenzij een foutafhandelaar is aangesloten om een gedocumenteerde degradatie te autoriseren. Vertrouwen wordt naar ontwerp door de aanroeper bepaald: ankers en intrekkingsbeleid zijn invoer, geen standaardwaarden van de engine, omdat een producent die zijn eigen vertrouwen zou beweren, een feit zou beweren dat alleen de verifier kan vaststellen. Vertrouwen in tijdstempels is terug te voeren op vertrouwen in de Time-Stamping Authority, die injecteerbaar is zodat een deployment zijn eigen Authority kan vastleggen. Deze pagina is gemarkeerd als export_control_class: legal-review-required omdat ze cryptografisch ondertekenen betreft; elke normatieve bron is geparafraseerd en geen enkele is gereproduceerd, conform de citatiehygiëne.
Conformiteit
Sectie met titel “Conformiteit”| Bewering | Standaard | Clausule | Bewijs |
|---|---|---|---|
De CMS-handtekening wordt DER-gecodeerd opgeslagen in de Contents-vermelding van het handtekeningwoordenboek. | ISO 32000-2 | §12.8.1 | |
| SignerInfo draagt ondertekende content-type- en message-digest-attributen. | RFC 5652 | §5.3 | |
| De verifier herberekent het samenvattingscijfer van de inhoud en vergelijkt dit met het message-digest-attribuut. | RFC 5652 | §5.4 | |
| Een tijdstempeltoken wordt geproduceerd door een RFC 3161 TSA en draagt een unieke serialNumber en een UTC genTime. | RFC 3161 | §2.4.1, §2.4.2 | ,, |
| Validatie van het certificeringspad controleert de basisbeperkingen en de padinvoer van de ondertekenaar naar een vertrouwensanker. | RFC 5280 | §6.1 | , |
| OCSP meldt certStatus als good, revoked of unknown, begrensd door thisUpdate / nextUpdate. | RFC 6960 | §2.2, §4.2 | , |
Alle clausules zijn geparafraseerd. NextPDF reproduceert geen normatieve tekst. Raadpleeg de gepubliceerde standaarden voor de gezaghebbende formulering.
Commerciële context
Sectie met titel “Commerciële context”Core levert de softwarematige CMS-ondertekenaar (RSA, RSASSA-PSS, ECDSA, Ed25519), het consumeren van RFC 3161-tijdstempels, RFC 5280-padvalidatie en OCSP / CRL-intrekkingscontrole. HSM- en Public-Key Cryptography Standards #11-sleutelbeheer (PKCS#11), uitgesteld ondertekenen en cloudondertekenen, de PAdES B-LT- en B-LTA-producent, en het crypto-beleidsprofiel Federal Information Processing Standards (FIPS) 140-3 worden geleverd in de Pro- en Enterprise-edities. Core lost deze tijdens runtime op via het contract, waardoor de opensource-engine geen commerciële afhankelijkheid heeft en de API bij een upgrade niet verandert.
Zie ook
Sectie met titel “Zie ook”- PAdES baseline-mapping — Core versus Premium voor B-B, B-T, B-LT, B-LTA.
- Contracts / Signing — de
SignerInterface-serviceproviderinterface (SPI) en stabiliteitsniveaus. - Security — versleuteling en het bredere handtekeningoppervlak.
- Conformance — profielhandhaving die samengaat met ondertekende archivering.
- CMS · RFC 3161 timestamp · Long-Term Validation (LTV) · Document Security Store (DSS) · Validation-Related Information (VRI) · Hardware Security Module (HSM) — woordenlijsttermen.