Verificare una PEC

Una PEC non è un'email con un bollino. È una busta firmata dal gestore, e dentro la busta c'è il messaggio che hai spedito o ricevuto. Verificare una PEC vuol dire verificare quella firma — e sapere con precisione che cosa copre, perché non copre tutto quello che il programma di posta ti mostra.

Cosa arriva davvero nella casella

Quando spedisci una PEC, il tuo messaggio non viaggia da solo. Il gestore del mittente lo chiude in una busta di trasporto e la firma; il gestore del destinatario, quando la mette nella casella, emette a sua volta una ricevuta firmata e la manda al mittente. Ogni passaggio produce un messaggio a sé, riconoscibile dal prefisso dell'oggetto e da un'intestazione dedicata (X-Trasporto per le buste, X-Ricevuta per le ricevute).

MessaggioL'oggetto inizia conCosa contiene
Busta di trasportoPOSTA CERTIFICATA:testo, daticert.xml, il messaggio originale in postacert.eml
Busta di anomaliaANOMALIA MESSAGGIO:un messaggio arrivato con errori, imbustato dal gestore che lo ha ricevuto
Ricevuta di accettazioneACCETTAZIONE:i dati di certificazione dell'invio
Ricevuta di avvenuta consegna, completaCONSEGNA:dati di certificazione e messaggio originale
… breveCONSEGNA:dati di certificazione e un estratto del messaggio
… sinteticaCONSEGNA:solo i dati di certificazione
AvvisiAVVISO DI NON ACCETTAZIONE:, AVVISO DI MANCATA CONSEGNA:…il motivo per cui l'invio non è andato a buon fine

Le tre forme della ricevuta di consegna sono definite dalle regole tecniche (DM 2 novembre 2005). Probatio ne tiene conto: cerca postacert.eml nella busta di trasporto, in quella di anomalia e nella ricevuta completa, e non lo pretende dalla breve e dalla sintetica, che per definizione non contengono l'originale intero.

La firma è tutto

Il valore di una PEC poggia su un fatto solo. Il DPR 11 febbraio 2005, n. 68, all'art. 9, stabilisce che le ricevute sono sottoscritte dal gestore con una firma elettronica avanzata, generata automaticamente dal sistema, che rende manifesta la provenienza e ne assicura integrità e autenticità; e che con la stessa firma è sottoscritta la busta di trasporto. Le regole tecniche aggiungono che i messaggi sono conformi allo standard S/MIME e che la busta di trasporto è consegnata immodificata, proprio per permettere al ricevente di verificare i dati di certificazione.

In pratica la busta è un multipart/signed: due parti, il contenuto e la firma.

Una busta di trasporto PEC, vista da dentro Intestazioni della busta From · To · Subject · Date · Message-ID · X-Trasporto fuori dalla firma si possono riscrivere senza toccarla Content-Type: multipart/signed — due parti, non una di più parte 1 · il contenuto firmato testo di accompagnamento scritto dal gestore daticert.xml mittente, destinatari oggetto, giorno, ora, fuso identificativo, msgid tipo di messaggio postacert.eml il messaggio originale con i suoi allegati, così come il mittente l'ha spedito parte 2 · smime.p7s firma S/MIME del gestore certificato del gestore emesso da AgID CA1 copre ogni byte della parte 1 parte 3 aggiunta dopo, per esempio con un secondo daticert.xml: nessuna firma la copre → PEC non valida
La firma del gestore copre la parte 1 e nient'altro. Le intestazioni che il programma di posta mostra in cima al messaggio stanno fuori.

Cosa copre la firma, e cosa no

La firma S/MIME è calcolata sui byte della prima parte: il testo di accompagnamento, daticert.xml e postacert.eml. Cambiare anche un solo carattere di uno di questi file fa fallire la verifica.

Le intestazioni della busta — Da, A, Oggetto, Data — non sono dentro quella parte. Sono le righe che il programma di posta mostra in cima, e si possono riscrivere senza che la firma se ne accorga. Per questo, quando la firma è integra, i dati che fanno fede sono quelli di daticert.xml: mittente, destinatari (ciascuno marcato certificato o esterno), oggetto, giorno, ora e fuso, gestore emittente, identificativo del messaggio.

Probatio lo dice esplicitamente in ogni verifica, e poi confronta le due versioni: mittente, destinatari, oggetto (tolto il prefisso), data (con una tolleranza di cinque minuti fra daticert.xml e l'intestazione Date), tipo di messaggio, nome del gestore rispetto al certificato. Una discordanza è un rilievo in ambra, non una condanna: la firma resta buona, ma qualcosa fra ciò che si vede e ciò che è certificato non torna, e va guardato.

Perché i dati si leggono solo dalla parte firmata

Ecco un attacco semplice. Si prende una PEC autentica e si aggiunge, dentro il multipart/signed, una terza parte con un secondo daticert.xml: oggetto diverso, data diversa. La firma originale non viene toccata, e resta crittograficamente valida — copre ancora la parte 1, che è intatta.

Uno strumento che si limita a controllare la struttura e poi legge il primo daticert.xml che trova nel messaggio può dare questa PEC per buona, con i dati falsi. È successo nelle prove fatte sviluppando il modulo, con un verificatore di questo tipo.

Probatio fa il contrario. Prima verifica la firma; poi prende i byte esatti coperti dalla firma e li analizza da soli, ed è da lì — e solo da lì — che legge daticert.xml e postacert.eml. Infine confronta le impronte di ciò che il messaggio mostra con quelle di ciò che è stato firmato. Una parte in più nel multipart/signed, o un file mostrato diverso da quello firmato, è un controllo in rosso e rende la PEC non valida, indicando per nome le parti non coperte.

Di chi è il certificato

Una firma integra dice che il contenuto non è cambiato dopo la firma. Non dice ancora chi ha firmato. Per quello serve risalire dal certificato del gestore a un'autorità riconosciuta.

Per il circuito PEC quell'autorità è AgID CA1, la CA dell'Agenzia per l'Italia Digitale che dal 20 novembre 2017 emette i certificati di firma dei gestori. Probatio la porta con sé, insieme alla radice Actalis che l'ha emessa, scaricate dal sito AgID. Il controllo è stretto: l'etichetta «AgID CA1» si dà solo se il certificato del gestore è firmato direttamente da un certificato con soggetto AgID CA1, Agenzia per l'Italia Digitale — quello in dotazione o uno portato nella busta. Non basta risalire alla radice Actalis: sotto la stessa radice possono stare certificati Actalis estranei al circuito PEC, e un certificato che arriva alla radice per un'altra strada fa diventare il controllo rosso, perché è fuori dal circuito PEC e non può firmare la busta di un gestore. Se il certificato non si riconduce né ad AgID CA1 né alla radice Actalis, Probatio prova l'elenco di fiducia AgID/UE che tiene in cache: è il caso normale delle PEC anteriori al novembre 2017, e viene annotato come informazione. Se non è nemmeno nell'elenco, il controllo è in ambra e mostra l'emittente.

Valido quando?

Qui si sbaglia spesso. La domanda giusta non è «il certificato del gestore è valido oggi?», ma «era valido nel momento in cui il gestore ha firmato?». Una PEC del 2024 firmata con un certificato scaduto nel 2025 non diventa falsa nel 2026.

La data che conta è quella della PEC A · revoca successiva alla PEC certificato valido: 1/3/2022 – 1/3/2025 PEC del 14/5/2024 revoca 20/11/2024 oggi: scaduto Esito A: PEC valida. Alla data della PEC il certificato era valido; revoca e scadenza successive sono solo annotate. B · revoca anteriore alla PEC certificato valido: 1/3/2022 – 1/3/2025 revoca 10/2/2024 PEC del 14/5/2024 Esito B: PEC non valida. Quando il gestore ha firmato, il certificato era già revocato. 2022 2023 2024 2025 2026 2027 Date di esempio. La data di riferimento è quella di daticert.xml; in sua assenza, la Date della busta.
Stesso certificato, stessa PEC. Cambia solo la posizione della revoca rispetto alla data di certificazione.

Probatio prende come istante di riferimento la data scritta in daticert.xml — giorno, ora e fuso, che stanno dentro la parte firmata — e controlla che cada nel periodo di validità del certificato. Se cade fuori, il controllo è rosso. Se il certificato è scaduto oggi ma era valido allora, lo annota come informazione: è la condizione normale di una PEC di qualche anno fa.

Poi c'è la revoca. Quando il computer è in linea, Probatio interroga il responder OCSP indicato nel certificato del gestore. Una revoca con data successiva a quella della PEC non la invalida: quando il gestore ha firmato, il certificato era buono. Una revoca alla data della PEC o prima, invece, sì. La richiesta OCSP la fa il processo principale dell'app, perché la lettura del messaggio avviene in un sottoprocesso isolato che non ha accesso alla rete.

Il Message-ID riscritto

Un dettaglio che manda in confusione chi confronta i messaggi a mano. daticert.xml porta due identificativi: identificativo, assegnato dal gestore, e msgid, il Message-ID del messaggio originale. Nella busta, l'originale è richiamato dall'intestazione X-Riferimento-Message-ID.

Nei file reali si incontrano due forme, entrambe coerenti. Nella prima il messaggio originale in postacert.eml conserva il proprio Message-ID, che coincide con msgid. Nella seconda il gestore lo ha sostituito con l'identificativo PEC e ha spostato quello originale in X-Riferimento-Message-ID. Probatio accetta la seconda forma solo se tornano entrambi i riscontri — Message-ID uguale a identificativo e X-Riferimento-Message-ID uguale a msgid — e lo scrive nel dettaglio del controllo. Una coincidenza sola non basta.

PEC salvate in altri formati

Outlook e i file MSG. Un .msg non contiene il messaggio così come è arrivato: Outlook lo scompone in proprietà. Per un messaggio firmato, però, Outlook di solito conserva la busta S/MIME intera come allegato smime.p7m (classe IPM.Note.SMIME.MultipartSigned). In quel caso Probatio ricompone il messaggio byte per byte e la PEC si verifica come sull'originale. Se la busta non c'è, il contenuto si legge ma la firma del gestore è persa: l'esito è non verificabile, non «valida» e nemmeno «falsa», e Probatio chiede il file .eml originale scaricato dalla casella. Il formato del file ha una guida a sé: EML, EMLX e MSG.

Apple Mail e i soli LF. La firma S/MIME è calcolata sulla forma canonica MIME, in cui ogni riga termina con CRLF. Molti programmi — Apple Mail, gli strumenti Unix — salvano il messaggio con i soli LF. Probatio verifica prima i byte così come sono; se l'impronta non torna, riprova sulla forma canonica CRLF e, se lì torna, lo dichiara. Anche i confronti fra parte mostrata e parte firmata si fanno nella stessa forma: altrimenti ogni PEC salvata da Apple Mail darebbe un falso allarme.

Il solo postacert.eml. Chi estrae il messaggio originale dalla busta e lo inoltra consegna un'email qualsiasi: niente X-Trasporto, niente daticert.xml, niente firma del gestore. Probatio risponde «non è una PEC» e spiega perché.

I quattro esiti

EsitoQuando
PEC validafirma del gestore integra e tutti i controlli superati
PEC valida, con rilievifirma integra, ma almeno un controllo di coerenza in ambra (intestazioni diverse da daticert.xml, certificato non ricondotto ad AgID CA1 né all'elenco, busta opaca, più firmatari)
PEC non validafirma non valida, contenuto modificato dopo la firma, parti non coperte, certificato fuori dal circuito PEC (risale alla radice Actalis ma non è emesso da AgID CA1), certificato fuori validità o revocato alla data della PEC, daticert.xml o postacert.eml mancanti dove previsti
PEC non verificabilemanca la firma del gestore leggibile: messaggio non firmato, MSG salvato senza la busta, oppure busta cifrata S/MIME — una busta PEC non è cifrata, quindi quel file non è la busta come l'ha consegnata il gestore

C'è anche un quinto caso, che non è un esito della verifica: non è una PEC, quando il messaggio non ha né le intestazioni PEC né i dati di certificazione.

Cosa dice la norma, in breve

Il DPR 68/2005 (art. 4, comma 6) stabilisce che la validità della trasmissione e della ricezione è attestata rispettivamente dalla ricevuta di accettazione e dalla ricevuta di avvenuta consegna. L'art. 6, comma 3, precisa che la ricevuta di avvenuta consegna prova che il messaggio è pervenuto all'indirizzo dichiarato dal destinatario e ne certifica il momento; il comma 5, che è rilasciata indipendentemente dall'avvenuta lettura. Il Codice dell'amministrazione digitale, all'art. 48, comma 3, rende opponibili ai terzi data e ora di trasmissione e ricezione se conformi al DPR 68/2005 e alle relative regole tecniche. Lo stesso art. 48 è destinato all'abrogazione quando sarà adottato il decreto che adegua la PEC al regolamento eIDAS (D.Lgs. 217/2017, art. 65, comma 7). Il valore giuridico dipende dalla norma; la verifica tecnica dice soltanto se la busta che hai in mano è quella firmata dal gestore.

I limiti

  • L'ancora incorporata è una sola: AgID CA1 nella riemissione del 2025, accompagnata dalla radice Actalis che serve solo a completarne la catena. Per i certificati di altre CA — le PEC più vecchie — la verifica dipende dall'elenco AgID/UE in cache. Se l'elenco non è mai stato scaricato, il certificato non si riconduce a nulla e l'esito scende a «valida, con rilievi».
  • La revoca richiede la rete e si controlla solo via OCSP, sul certificato del gestore. Fuori linea il controllo manca, e l'esito non lo sostituisce: lo si legge nel rapporto. Le CRL non sono consultate.
  • L'istante di riferimento lo scrive il gestore stesso in daticert.xml. Probatio verifica che sia coperto dalla firma, non lo confronta con una fonte di tempo indipendente.
  • L'Indice dei gestori PEC non è pubblico e non viene interrogato: Probatio non sa dire se un gestore fosse iscritto a una certa data.
  • Un MSG senza busta S/MIME resta non verificabile: la firma persa nel salvataggio non si ricostruisce.

In pratica

  1. Conserva il file originale, scaricato dalla casella in formato .eml. Le stampe, gli inoltri e le conversioni sono le prime cose a perdere la firma.
  2. Verifica con il computer in linea, così il rapporto include lo stato di revoca del certificato del gestore.
  3. Cita i dati di daticert.xml, non le intestazioni della busta: sono i soli coperti dalla firma.
  4. Leggi i rilievi in ambra uno per uno. Non invalidano la PEC, ma in una relazione vanno spiegati.
  5. Per il meccanismo generale della verifica di una firma — catena, validità, revoca — vedi Verificare una firma digitale. Il modulo è descritto nella scheda Verifica PEC.

Una PEC vale quanto la firma del gestore e quanto ciò che quella firma copre. Il resto — le intestazioni, il modo in cui il programma di posta la mostra — è presentazione. Verificarla significa separare le due cose.