Eine vorhandene Signatur prüfen und die Vertrauensgrenze verstehen
Auf einen Blick
Abschnitt betitelt „Auf einen Blick“Dieses Recipe verwendet den Core-Inspector, um zu erkennen, ob ein PDF eine Signatur enthält, und zieht anschließend die Grenze. Eine Signatur zu erkennen, heißt nicht, sie zu verifizieren. Kryptografische Verifizierung, Validierung des Vertrauenspfads und Sperrprüfung sind Premium-Funktionen oder müssen extern erfolgen.
Voraussetzungen
Abschnitt betitelt „Voraussetzungen“- Core installiert:
composer require nextpdf/core:^3. - Eine PDF-Datei zum Prüfen.
- Lesen Sie die PDF-Bytes ein.
- Erstellen Sie einen
Inspectorund rufen Sieinspect()auf. - Lesen Sie
InspectResult::$hasSignedaus.truebedeutet, dass die Datei ein Signaturwörterbuch enthält. - Lesen Sie
InspectResult::$isEncryptedund die Risiko-Flags für den umgebenden Kontext aus. - Leiten Sie die Datei für die kryptografische Entscheidung an einen Verifizierer weiter. Der Inspector meldet das Vorhandensein, nicht die Gültigkeit.
Das folgende Diagramm zeigt zwei Dinge: die Grenze, die dieses Recipe klarzieht (Vorhandensein ist nicht Gültigkeit), und den vollständigen Satz an Prüfungen, den eine echte Verifizierung weiterhin leisten muss.
Vollständiges Beispiel
Abschnitt betitelt „Vollständiges Beispiel“<?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";}Erwartete Ausgabe
Abschnitt betitelt „Erwartete Ausgabe“Für eine signierte Eingabe:
A signature is present in incoming.pdfEncrypted: noNext step: run a cryptographic verifier before trusting it.Für eine nicht signierte Eingabe:
No signature found in incoming.pdfSonderfälle
Abschnitt betitelt „Sonderfälle“- Vorhandensein ist nicht Gültigkeit — die Grenze.
InspectResult::$hasSignedmeldet, dass in der Datei ein Signaturwörterbuch vorhanden ist. Es prüft weder die CMS-Struktur noch den Byte-Range-Digest, das Signaturzertifikat, die Zertifikatskette oder den Sperrstatus. Eine manipulierte Datei kann weiterhinhasSigned = truemelden. Behandeln Sie das Vorhandensein niemals als Nachweis für Integrität oder Urheberschaft. - Was eine vollständige Verifizierung erfordert. Eine vollständige Entscheidung berechnet den Byte-Range-Digest neu und vergleicht ihn (ISO 32000-2 §12.8.1), validiert die CMS SignedData, baut den X.509-Pfad zu einem vertrauenswürdigen Anker auf und prüft ihn sowie die Sperrung über OCSP oder CRL. Für die Langzeitvalidierung liegen die Validierungsdaten im DSS (ETSI EN 319 142-2 §6.3.1). Diese Vorgänge werden über die Verträge
SignerInterfaceundLtvManagerInterfaceabgebildet; die produktiven Implementierungen werden in den Pro- und Enterprise-Editionen ausgeliefert. Der andere unterstützte Weg ist ein externer Validator. - Prüftiefe und der Sidecar (SIDECAR-001). Bei einem standardmäßig erzeugten
new Inspector()ist kein Spectrum-Sidecar konfiguriert. Ohne Sidecar liefert nurInspectDepth::Quickein Ergebnis.InspectDepth::Quicknutzt den prozessinternen PHP-Fallback.InspectDepth::StandardundInspectDepth::Fullbenötigen beide den Sidecar. Ist kein Sidecar verfügbar, werfen sie eineInspectExceptionmit CodeINSPECT-SIDECAR-001(„Spectrum sidecar is required for Standard/Full depth inspection“,retryable = true). Im Konstruktor vonInspectConfigist StandardtiefeStandardvoreingestellt. Daher ist ein bloßesnew InspectConfig()(odernew InspectConfig(depth: InspectDepth::Standard)) nicht offline nutzbar. Dabei wird SIDECAR-001 geworfen, bevorhasSignedüberhaupt gelesen wird. Verwenden SieInspectConfig::quick()für die Offline-Erkennung des Vorhandenseins, wie in diesem Recipe. Keine der Tiefen führt in Core eine kryptografische Signaturverifizierung durch. - Leere Eingabe. Ein leerer String wirft eine
InspectExceptionmit CodeINSPECT-INPUT-001. Sichern Sie den Lesevorgang ab. - Mehrere Signaturen. Das Flag für das Vorhandensein zählt keine Signaturen und unterscheidet auch nicht zwischen einer Genehmigungssignatur und einem Dokumentzeitstempel. Verwenden Sie einen dedizierten Verifizierer, wenn die Anzahl oder das Urteil pro Signatur wichtig ist.
Konformität
Abschnitt betitelt „Konformität“| Aussage | Spezifikation | Abschnitt | reference_id |
|---|---|---|---|
Der Signaturwert wird im Eintrag Contents des Signaturwörterbuchs gespeichert. | ISO 32000-2 | §12.8.1 | |
Die Verifizierung berechnet den Digest über den ByteRange neu und schließt den Signaturwert aus. | ISO 32000-2 | §12.8.1 | |
| Validierungsdaten für die Langzeitvalidierung liegen im DSS. | ETSI EN 319 142-2 | §6.3.1 |
Dieses Recipe erkennt eine Signatur. Es behauptet nicht, dass eine Signatur gültig, vertrauenswürdig oder ungesperrt ist. Diese Entscheidung gehört zu einem kryptografischen Verifizierer.