Przejdź do głównej zawartości

Sprawdź istniejący podpis i poznaj granicę zaufania

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.

  • Zainstalowana edycja Core: composer require nextpdf/core:^3.
  • Plik PDF do sprawdzenia.
  1. Odczytaj bajty pliku PDF.
  2. Utwórz obiekt Inspector i wywołaj inspect().
  3. Odczytaj InspectResult::$hasSigned. Wartość true oznacza, że plik zawiera słownik podpisu.
  4. Odczytaj InspectResult::$isEncrypted oraz flagi ryzyka, aby uzyskać szerszy kontekst.
  5. 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ć.

false

true

Yes

No

Yes

No / unknown

Incoming PDF

Inspector.inspect — Quick

hasSigned?

No signature present

Signature dictionary PRESENT

NOT yet validity

Recompute byte-range digest

ISO 32000-2 §12.8.1

Validate CMS SignedData

Build & check X.509 path

to a chosen trust anchor

Check revocation OCSP / CRL

Long-term input?

Read DSS validation material

All checks evaluated

Every check passed?

Trustworthy

Not trusted — do not act

Diagram
<?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";
}

Dla pliku z podpisem:

A signature is present in incoming.pdf
Encrypted: no
Next step: run a cryptographic verifier before trusting it.

Dla pliku bez podpisu:

No signature found in incoming.pdf
  • Obecność to nie ważność — granica. InspectResult::$hasSigned informuje, ż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 SignerInterface oraz LtvManagerInterface; 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 dla InspectDepth::Quick. InspectDepth::Quick korzysta z awaryjnej implementacji PHP działającej w tym samym procesie. InspectDepth::Standard oraz InspectDepth::Full wymagają komponentu sidecar. Jeśli komponent sidecar nie jest dostępny, zgłaszają InspectException z kodem INSPECT-SIDECAR-001 („Spectrum sidecar is required for Standard/Full depth inspection”, retryable = true). Domyślną głębokością konstruktora InspectConfig jest Standard. W związku z tym samo new InspectConfig() (lub new InspectConfig(depth: InspectDepth::Standard)) nie nadaje się do użytku w trybie offline. Zgłasza SIDECAR-001, zanim hasSigned zostanie w ogóle odczytane. Do wykrywania obecności podpisu w trybie offline użyj InspectConfig::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 InspectException z kodem INSPECT-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.
StwierdzenieSpecyfikacjaPunktreference_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.