Esaminare una firma esistente e delimitarne il confine di attendibilità
In breve
Sezione intitolata “In breve”Questa ricetta usa l’inspector di Core per rilevare se un PDF contiene una firma e ne delinea il confine di attendibilità. Rilevare una firma non significa verificarla. La verifica crittografica, la convalida del percorso di attendibilità e il controllo della revoca sono funzionalità Premium o esterne.
Prerequisiti
Sezione intitolata “Prerequisiti”- Core installato:
composer require nextpdf/core:^3. - Un file PDF da esaminare.
Ricetta
Sezione intitolata “Ricetta”- Leggere i byte del PDF.
- Creare un
Inspectore chiamareinspect(). - Leggere
InspectResult::$hasSigned.trueindica che nel file è presente un dizionario di firma. - Leggere
InspectResult::$isEncryptede i flag di rischio per il contesto circostante. - Inviare il file a un verificatore per la decisione crittografica. L’inspector segnala la presenza, non la validità.
Il diagramma seguente mostra due aspetti: il confine che questa ricetta rende esplicito, cioè la presenza non è validità, e l’insieme completo dei controlli che una verifica reale deve comunque eseguire.
Esempio completo
Sezione intitolata “Esempio completo”<?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";}Output previsto
Sezione intitolata “Output previsto”Per un input firmato:
A signature is present in incoming.pdfEncrypted: noNext step: run a cryptographic verifier before trusting it.Per un input non firmato:
No signature found in incoming.pdfCasi limite
Sezione intitolata “Casi limite”- La presenza non è validità — confine.
InspectResult::$hasSignedindica che nel file è presente un dizionario di firma. Non verifica la struttura CMS, il digest del byte-range, il certificato di firma, la catena di certificati né lo stato di revoca. Un file manomesso può comunque restituirehasSigned = true. Non considerare mai la presenza come prova di integrità o paternità. - Cosa richiede una verifica completa. Una verifica completa richiede di ricalcolare il digest del byte-range e confrontarlo (ISO 32000-2 §12.8.1), convalidare il SignedData CMS, costruire e verificare il percorso X.509 fino a un’ancora attendibile e controllare la revoca tramite OCSP o CRL. Per gli input a lungo termine, i dati di convalida risiedono nel DSS (ETSI EN 319 142-2 §6.3.1). Queste operazioni sono esposte dai contratti
SignerInterfaceeLtvManagerInterface; le implementazioni di produzione sono incluse nelle edizioni Pro ed Enterprise. L’altro percorso supportato è un validatore esterno. - Profondità di ispezione e sidecar (SIDECAR-001). Un
new Inspector()creato con la configurazione predefinita non ha alcun sidecar Spectrum configurato. Senza un sidecar, soloInspectDepth::Quickrestituisce un risultato.InspectDepth::Quickusa il fallback PHP in-process.InspectDepth::StandardeInspectDepth::Fullrichiedono entrambi il sidecar. Se non è disponibile alcun sidecar, generanoInspectExceptioncon codiceINSPECT-SIDECAR-001(“Spectrum sidecar is required for Standard/Full depth inspection”,retryable = true). Il costruttore diInspectConfigha come profondità predefinitaStandard. Pertanto un semplicenew InspectConfig()(onew InspectConfig(depth: InspectDepth::Standard)) non è utilizzabile offline. Genera SIDECAR-001 prima ancora chehasSignedvenga letto. UsareInspectConfig::quick()per rilevare la presenza offline, come in questa ricetta. Nessuna delle profondità esegue la verifica crittografica della firma in Core. - Input vuoto. Una stringa vuota genera
InspectExceptioncon codiceINSPECT-INPUT-001. Controllare la lettura. - Firme multiple. Il flag di presenza non conta le firme né distingue una firma di approvazione da una marca temporale del documento. Usare un verificatore dedicato quando il conteggio o il verdetto per ogni firma è rilevante.
Conformità
Sezione intitolata “Conformità”| Dichiarazione | Specifica | Clausola | reference_id |
|---|---|---|---|
Il valore della firma è memorizzato nella voce Contents del dizionario di firma. | ISO 32000-2 | §12.8.1 | |
La verifica ricalcola il digest sul ByteRange, escludendo il valore della firma. | ISO 32000-2 | §12.8.1 | |
| I dati di convalida a lungo termine risiedono nel DSS. | ETSI EN 319 142-2 | §6.3.1 |
Questa ricetta si limita a rilevare una firma. Non garantisce che una firma sia valida, attendibile o non revocata. Tale decisione spetta a un verificatore crittografico.