Ga naar inhoud
getnextpdf.com

Enterprise editie

NextPDF Enterprise snelstart

Deze tutorial brengt je van een leeg project naar twee werkende Enterprise-resultaten. Eerst verifieer je een bestaande ondertekende PDF en lees je de MainIndication ervan. Daarna til je een ondertekend document naar PAdES B-LT met de long-term producer. Elke stap toont de precieze output of exception die je mag verwachten. NextPDF documenteert capaciteit, geen certificering: het heeft geen PAdES- of eIDAS-certificering en verleent die ook niet.

Deze capaciteit wordt geleverd in NextPDF Enterprise (nextpdf/enterprise) en activeert met een license envelope op Enterprise-niveau. Een deployment zonder die entitlement laadt de klassen van de capaciteit niet. Vergelijk edities en koop een licentie.

  • Composer is geconfigureerd voor de private NextPDF-repository. Volg eerst Installeren en authenticeren.
  • Je hebt je Enterprise license envelope, gedownload uit je account op app.getnextpdf.com. Licensing en activering legt uit wat de envelope is en waar die hoort.
  • Voor stap 3 heb je een ondertekende PDF nodig om te verifiëren. Voor het B-LT-gedeelte heb je ook je signer certificate en netwerktoegang tot OCSP/CRL-responders nodig.

Vereis het Enterprise-package. Het is afhankelijk van nextpdf/core en nextpdf/pro, dus Composer haalt de hele stack binnen:

Terminal window
composer require nextpdf/enterprise
composer show nextpdf/enterprise

Als composer show het package en de versie ervan afdrukt, is de installatie gelukt. Plaats nu de ondertekende license envelope op de plek waar je deployment die laadt, precies zoals Licensing en activering beschrijft. Alleen het package installeren verleent geen Enterprise-capaciteiten; de geactiveerde licentie selecteert de editie.

Vraag de entitlement-evaluator wat je licentie verleent. Je bootstrap verkrijgt de geverifieerde NextPDF\Enterprise\Licensing\LicenseKey tijdens de activering; geef die door:

<?php
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Licensing\EntitlementEvaluator;
use NextPDF\Enterprise\Licensing\LicenseKey;
/** @var LicenseKey|null $license The verified license from activation. */
$result = (new EntitlementEvaluator())->evaluate($license);
echo 'status: ' . $result->status->value . PHP_EOL;
echo 'edition: ' . ($result->edition?->value ?? 'none') . PHP_EOL;
echo 'runtime: ' . ($result->runtimeAllowed ? 'allowed' : 'disabled') . PHP_EOL;

Met een actieve Enterprise-licentie zie je:

status: active
edition: enterprise
runtime: allowed

De methode achter deze stap:

public function evaluate(?LicenseKey $license, ?DateTimeImmutable $now = null): EntitlementResult

Gooit of faalt met: hij gooit nooit. Een ontbrekende licentie retourneert een fail-closed EntitlementResult met EntitlementStatus::NoLicense en runtimeAllowed false (zie stap 4).

Extraheer de handtekening uit een ondertekende PDF en voer dan basis-AdES-validatie uit. De engine implementeert de validatieniveaus van ETSI EN 319 102-1; validateBasic() is de flow van clausule 5.2 — structuur, digest, handtekening-crypto en de certificaatketen:

<?php
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Security\Validation\AdESValidationEngine;
use NextPDF\Enterprise\Security\Validation\CmsSignatureDataExtractor;
use NextPDF\Enterprise\Signature\SignatureExtractor;
$pdf = file_get_contents(__DIR__ . '/contract-signed.pdf');
if ($pdf === false) {
throw new RuntimeException('Could not read contract-signed.pdf');
}
$signatures = (new SignatureExtractor())->extract($pdf);
if ($signatures === []) {
throw new RuntimeException('The PDF carries no signature dictionary.');
}
$engine = new AdESValidationEngine(extractor: new CmsSignatureDataExtractor());
$report = $engine->validateBasic(
$signatures[0]['signedBytes'], // the exact /ByteRange-covered bytes
$signatures[0]['contents'], // the DER CMS SignedData from /Contents
);
echo $report->mainIndication->name . PHP_EOL;
echo ($report->subIndication?->name ?? '(none)') . PHP_EOL;

Voor een welgevormde handtekening die de basale structurele, digest-, cryptografische en ketencontroles doorstaat die in dit voorbeeld zijn geconfigureerd, zie je:

TOTAL_PASSED
(none)

MainIndication heeft precies drie gevallen: TOTAL_PASSED, TOTAL_FAILED en INDETERMINATE. De engine is fail-closed: een controle die hij niet positief kan vaststellen levert INDETERMINATE op, nooit een stille pass. Een pass hier is een validatie-uitkomst onder de controles van deze engine, geen trust- of certificeringsuitspraak — trust anchors en langetermijnbewijs horen bij de diepere niveaus op de verificatiepagina.

public function extract(string $pdfData): array

Gooit of faalt met: InvalidArgumentException als de input geen geldige PDF is. Een misvormde /ByteRange of /Contents levert lege strings op (fail-closed), nooit een positief resultaat.

public function validateBasic(string $signedData, string $signature): ValidationReport

Gooit of faalt met: hij gooit nooit bij een verificatiefout. Elk defect wordt afgebeeld op een ValidationReport-indicatie, bijv. HASH_FAILURE of SIG_CRYPTO_FAILURE.

Upgrade nu een vers ondertekend document naar B-LT. De long-term producer verzamelt de certificaatketen plus OCSP/CRL-bewijs en schrijft de Document Security Store (DSS). Hij zet de ondertekeningsronde voort die op de Handtekeningpagina wordt beschreven, die je de output buffer, het object registry en de handtekening-/Contents-hex geeft:

use NextPDF\Enterprise\Security\Ltv\LtvManager;
use NextPDF\Security\Signature\CertificateInfo;
use NextPDF\Security\Signature\SignatureLevel;
$certInfo = CertificateInfo::fromPkcs12('/secure/signer.p12', $p12Password);
// $httpClient is any PSR-18 client; it fetches OCSP responses and CRLs.
$ltv = new LtvManager($certInfo, $httpClient, level: SignatureLevel::PAdES_B_LT);
// $buffer, $registry, and $signatureContentsHex come from the signing pass.
$dssObjectNumber = $ltv->enableLtv($buffer, $registry, $signatureContentsHex);

De retourwaarde is het DSS-objectnummer voor de /DSS-entry van de document catalog. De producer gebruikt standaard strikte intrekkingscontrole: ontbrekend intrekkingsmateriaal gooit een exception in plaats van stilzwijgend een hol “B-LT”-bestand uit te geven.

public function enableLtv(BinaryBuffer $buffer, ObjectRegistry $registry, string $signatureContentsHex): int

Gooit of faalt met: NextPDF\Enterprise\Security\Ltv\LtvException wanneer ketenvalidatie faalt, wanneer het certificaat is ingetrokken, of wanneer intrekkingsmateriaal ontbreekt onder de strikte standaardinstelling.

status: no_license — de envelope is niet geladen

Sectie met titel “status: no_license — de envelope is niet geladen”

Stap 2 drukt status: no_license en runtime: disabled af, en het resultaat draagt de waarschuwing No license configured. Enterprise runtime is disabled. Install a license or purchase one at https://nextpdf.dev/pricing. Een entitlement-gated aanroep gooit vervolgens NextPDF\Accelerator\Exception\SpectrumAuthenticationException met code SPEC-LIC-001, bijv. Capability '...' requires a valid license. Oplossing: plaats en activeer de envelope volgens Licensing en activering, en voer stap 2 opnieuw uit.

InvalidArgumentException: Input does not start with %PDF header

Sectie met titel “InvalidArgumentException: Input does not start with %PDF header”

SignatureExtractor::extract() heeft iets ontvangen dat geen PDF is — een verkeerd pad, een lege read, of een gecomprimeerde download. Controleer het bestand dat je hebt geladen. Een lege $signatures-lijst is iets anders: het bestand is een PDF, maar draagt geen /Type /Sig-dictionary, dus er valt niets te verifiëren.

LtvException: Strict revocation: LTV warning: no revocation data for certificate at chain position 0

Sectie met titel “LtvException: Strict revocation: LTV warning: no revocation data for certificate at chain position 0”

enableLtv() kon geen OCSP-response of CRL verkrijgen voor een ketencertificaat, en de strikte standaardinstelling weigert een B-LT-claim te schrijven zonder bewijs. Controleer de bereikbaarheid van de responder vanaf de host, of geef enforcementMode: RevocationEnforcementMode::PERMISSIVE alleen door als je uitdrukkelijk een warn-only run accepteert — bestempel dergelijke output nooit als B-LT voor productie- of compliance-workflows, tenzij het ontbrekende intrekkingsbewijs uitdrukkelijk wordt geaccepteerd en gedocumenteerd. Gerelateerd: B-LTA aanvragen zonder een TSA-client faalt met LtvException: TSA client required for document timestamps.