Sprawdź istniejący podpis i poznaj granicę zaufania
W skrócie
Dział zatytułowany „W skrócie”Użyj inspektora z edycji Core, aby wykryć, czy dokument PDF zawiera podpis, i zachowaj wyraźną granicę zaufania. Samo wykrycie nie jest weryfikacją. Weryfikację kryptograficzną, walidację ścieżki zaufania oraz sprawdzanie statusu unieważnienia wykonują edycje premium albo zewnętrzny weryfikator.
Wymagania wstępne
Dział zatytułowany „Wymagania wstępne”- Zainstalowana edycja Core:
composer require nextpdf/core:^3. - Plik PDF do sprawdzenia.
Przepis
Dział zatytułowany „Przepis”- Odczytaj bajty pliku PDF.
- Utwórz obiekt
Inspectori wywołajinspect(). - Odczytaj
InspectResult::$hasSigned. Wartośćtrueoznacza, że plik zawiera słownik podpisu. - Odczytaj
InspectResult::$isEncryptedoraz flagi ryzyka, aby uzyskać szerszy kontekst. - Przekaż plik do weryfikatora, który podejmie decyzję kryptograficzną. Inspektor zgłasza obecność podpisu, nie jego ważność.
Poniższy diagram pokazuje tę granicę: obecność to nie ważność. Wskazuje też kontrole, które rzeczywisty weryfikator nadal musi przeprowadzić.
Pełny przykład
Dział zatytułowany „Pełny przykład”<?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";}Oczekiwany wynik
Dział zatytułowany „Oczekiwany wynik”Dla pliku z podpisem:
A signature is present in incoming.pdfEncrypted: noNext step: run a cryptographic verifier before trusting it.Dla pliku bez podpisu:
No signature found in incoming.pdfPrzypadki brzegowe
Dział zatytułowany „Przypadki brzegowe”- Obecność to nie ważność — granica.
InspectResult::$hasSignedinformuje, że w pliku istnieje słownik podpisu. Nie weryfikuje struktury Cryptographic Message Syntax (CMS), skrótu obliczonego dla zakresu bajtów, certyfikatu podpisującego, łańcucha certyfikatów ani statusu unieważnienia. Zmanipulowany plik nadal może zgłaszaćhasSigned = true. Nigdy nie traktuj obecności jako dowodu integralności ani autorstwa. - Czego wymaga pełna weryfikacja. Pełna decyzja weryfikacyjna obejmuje ponowne obliczenie skrótu dla zakresu bajtów i porównanie go (ISO 32000-2 §12.8.1), walidację struktury CMS SignedData, zbudowanie i sprawdzenie ścieżki X.509 do zaufanej kotwicy oraz sprawdzenie unieważnienia za pomocą protokołu Online Certificate Status Protocol (OCSP) albo listy unieważnionych certyfikatów (CRL). W przypadku danych długoterminowych dane walidacyjne znajdują się w Document Security Store (DSS), czyli magazynie zabezpieczeń dokumentu (ETSI EN 319 142-2 §6.3.1). Operacje te są dostępne za pośrednictwem kontraktów
SignerInterfaceorazLtvManagerInterface; implementacje produkcyjne dostarczane są w edycjach Pro i Enterprise. Inną obsługiwaną ścieżką jest zewnętrzny walidator. - Głębokość inspekcji i komponent sidecar (SIDECAR-001). Domyślny obiekt
new Inspector()nie ma skonfigurowanego komponentu sidecar Spectrum. Bez komponentu sidecar wynik jest zwracany tylko dlaInspectDepth::Quick.InspectDepth::Quickkorzysta z awaryjnej implementacji PHP działającej w tym samym procesie.InspectDepth::StandardorazInspectDepth::Fullwymagają komponentu sidecar. Jeśli komponent sidecar nie jest dostępny, zgłaszająInspectExceptionz kodemINSPECT-SIDECAR-001(„Spectrum sidecar is required for Standard/Full depth inspection”,retryable = true). Domyślną głębokością konstruktoraInspectConfigjestStandard. W związku z tym samonew InspectConfig()(lubnew InspectConfig(depth: InspectDepth::Standard)) nie nadaje się do użytku w trybie offline. Zgłasza SIDECAR-001, zanimhasSignedzostanie w ogóle odczytane. Do wykrywania obecności podpisu w trybie offline użyjInspectConfig::quick(), tak jak w tym przepisie. Żadna głębokość w edycji Core nie wykonuje kryptograficznej weryfikacji podpisu. - Puste dane wejściowe. Pusty ciąg znaków powoduje zgłoszenie
InspectExceptionz kodemINSPECT-INPUT-001. Zabezpiecz odczyt pliku. - Wiele podpisów. Flaga obecności nie zlicza podpisów ani nie rozróżnia podpisu zatwierdzającego od znacznika czasu dokumentu. Jeśli istotna jest liczba podpisów lub werdykt dla poszczególnych podpisów, użyj dedykowanego weryfikatora.
Zgodność
Dział zatytułowany „Zgodność”| Stwierdzenie | Specyfikacja | Punkt | reference_id |
|---|---|---|---|
Wartość podpisu jest przechowywana we wpisie Contents słownika podpisu. | ISO 32000-2 | §12.8.1 | |
Weryfikacja ponownie oblicza skrót dla ByteRange, z wyłączeniem wartości podpisu. | ISO 32000-2 | §12.8.1 | |
| Długoterminowe dane walidacyjne znajdują się w DSS. | ETSI EN 319 142-2 | §6.3.1 |
Ten przepis wykrywa, czy podpis jest obecny. Nie potwierdza, że jakikolwiek podpis jest ważny, zaufany lub nieunieważniony. Ta decyzja należy do weryfikatora kryptograficznego.