Een bestaande handtekening inspecteren en de vertrouwensgrens begrijpen
In een oogopslag
Sectie met titel “In een oogopslag”Gebruik de Core-inspector om vast te stellen of een PDF een handtekening bevat en houd de vertrouwensgrens duidelijk. Detectie is geen verificatie. Premium-edities of een externe verifier verzorgen cryptografische verificatie, validatie van het vertrouwenspad en intrekkingscontrole.
Vereisten
Sectie met titel “Vereisten”- Core geïnstalleerd:
composer require nextpdf/core:^3. - Een PDF-bestand om te inspecteren.
- Lees de PDF-bytes in.
- Maak een
Inspectoraan en roepinspect()aan. - Lees
InspectResult::$hasSigned.truebetekent dat het bestand een handtekeningwoordenboek bevat. - Lees
InspectResult::$isEncrypteden de risicovlaggen voor extra context. - Stuur het bestand naar een verifier voor de cryptografische beslissing. De inspector rapporteert aanwezigheid, niet geldigheid.
Het diagram hieronder laat de grens zien: aanwezigheid is geen geldigheid. Ook toont het welke controles een echte verifier nog moet uitvoeren.
Volledig voorbeeld
Sectie met titel “Volledig voorbeeld”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Inspect\Inspector;use NextPDF\Inspect\InspectConfig;
$pdfData = file_get_contents(__DIR__ . '/incoming.pdf');if ($pdfData === false || $pdfData === '') { fwrite(STDERR, "Cannot read incoming.pdf\n"); exit(1);}
$inspector = new Inspector();
// InspectConfig::quick() selects InspectDepth::Quick. This is the only// depth that runs offline: a default Inspector has no Spectrum sidecar,// and without a sidecar Quick is the sole path that returns a result.// Standard and Full require the sidecar (see the SIDECAR-001 edge case).$result = $inspector->inspect( $pdfData, InspectConfig::quick(),);
// hasSigned reports the PRESENCE of a signature dictionary.// It does NOT mean the signature verifies.if ($result->hasSigned) { echo "A signature is present in incoming.pdf\n"; echo "Encrypted: " . ($result->isEncrypted ? 'yes' : 'no') . "\n"; echo "Next step: run a cryptographic verifier before trusting it.\n";} else { echo "No signature found in incoming.pdf\n";}Verwachte uitvoer
Sectie met titel “Verwachte uitvoer”Voor een ondertekende invoer:
A signature is present in incoming.pdfEncrypted: noNext step: run a cryptographic verifier before trusting it.Voor een niet-ondertekende invoer:
No signature found in incoming.pdfRandgevallen
Sectie met titel “Randgevallen”- Aanwezigheid is geen geldigheid — grens.
InspectResult::$hasSignedrapporteert dat er een handtekeningwoordenboek in het bestand aanwezig is. Het controleert de structuur van de Cryptographic Message Syntax (CMS), de byte-range-digest, het ondertekeningscertificaat, de certificaatketen of de intrekkingsstatus niet. Een gemanipuleerd bestand kan nog steedshasSigned = truerapporteren. Beschouw aanwezigheid nooit als bewijs van integriteit of auteurschap. - Wat volledige verificatie vereist. Een volledige beslissing herberekent de byte-range-digest en vergelijkt deze (ISO 32000-2 §12.8.1), valideert de CMS SignedData, bouwt en controleert het X.509-pad naar een vertrouwd anker en controleert intrekking via het Online Certificate Status Protocol (OCSP) of een certificaatintrekkingslijst (CRL). Bij langetermijninvoer staan de validatiegegevens in de Document Security Store (DSS) (ETSI EN 319 142-2 §6.3.1). Deze bewerkingen zijn ondergebracht achter de contracten
SignerInterfaceenLtvManagerInterface; de productie-implementaties worden geleverd in de Pro- en Enterprise-edities. Een externe validator is de andere ondersteunde route. - Inspectiediepte en de sidecar (SIDECAR-001). Bij een standaard
new Inspector()is geen Spectrum-sidecar geconfigureerd. Zonder sidecar levert alleenInspectDepth::Quickeen resultaat op.InspectDepth::Quickgebruikt de in-process PHP-fallback.InspectDepth::StandardenInspectDepth::Fullvereisen beide de sidecar. Als er geen sidecar beschikbaar is, gooien ze eenInspectExceptionmet codeINSPECT-SIDECAR-001(“Spectrum sidecar is required for Standard/Full depth inspection”,retryable = true). De constructor vanInspectConfiggebruikt standaard de diepteStandard. Daarom is een kalenew InspectConfig()(ofnew InspectConfig(depth: InspectDepth::Standard)) niet offline bruikbaar. Die gooit SIDECAR-001 voordathasSignedooit wordt gelezen. GebruikInspectConfig::quick()voor offline aanwezigheidsdetectie, zoals in dit recipe. Geen enkele diepte voert in Core cryptografische handtekeningverificatie uit. - Lege invoer. Een lege tekenreeks gooit
InspectExceptionmet codeINSPECT-INPUT-001. Vang daarom fouten bij het lezen van het bestand af. - Meerdere handtekeningen. De aanwezigheidsvlag telt het aantal handtekeningen niet en maakt geen onderscheid tussen een goedkeuringshandtekening en een documenttijdstempel. Gebruik een gespecialiseerde verifier wanneer het aantal of het oordeel per handtekening van belang is.
Conformiteit
Sectie met titel “Conformiteit”| Verklaring | Specificatie | Clausule | reference_id |
|---|---|---|---|
De handtekeningwaarde staat in het Contents-item van het handtekeningwoordenboek. | ISO 32000-2 | §12.8.1 | |
Verificatie herberekent de digest over de ByteRange, waarbij de handtekeningwaarde is uitgesloten. | ISO 32000-2 | §12.8.1 | |
| Langetermijnvalidatiegegevens staan in de DSS. | ETSI EN 319 142-2 | §6.3.1 |
Dit recipe detecteert of er een handtekening aanwezig is. Het beweert niet dat een handtekening geldig, vertrouwd of niet-ingetrokken is. Die beslissing hoort thuis bij een cryptografische verifier.