Firma digitale: come si estrae il contenuto di un file firmato dal suo involucro P7M?

Vi è mai capitato di dover “sfirmare” ovvero estrarre il contenuto di un file firmato dal suo “involucro” o busta crittografica PKCS#7 o*.P7M?

Cerchiamo di capire in breve come funziona il sistema di firma a norma dal solo punto di vista utile ad ottenere l’estrazione del contenuto onde evitare di protrarre troppo il discorso.

I file firmati, secondo la normativa italiana, sono di tre tipi:

  1. *.xxx.p7m (il consueto sistema che adotta un container pkcs#7 che raggruppa: contenuto, firma e certificato)
  2. *.pdf  (la firma sta all’interno del file PDF stesso; è un embedded pkcs#7)
  3. *.XML (xml signature, un sistema di firma di tipo detached molto articolata che consente la verifica dell’XML e l’utilizzo stesso nei processi di business)

Il formato PDF (Portable Document Format) rilasciato (nella parte PDF-A) al pubblico dominio da parte di Adobe è stato da poco aggiunto dal CNIPA ai formati ammessi per la firma digitale. In realtà non è nulla di nuovo, il formato all’interno è sempre PKCS#7 ma l’interfaccia rende immediatamente fruibile il contenuto senza le operazioni di estrazione (assimilabili all’unzip + controllo di firma) che vedremo dopo.

Nel nostro caso ci interesseremo solo del formato descritto al punto 1, il P7M.

Mentre il PDF firmato non può essere altro che un documento digitale, il formato P7M è a tutti gli effetti un involucro (cryptographic envelope) che può contenere qualsiasi file: pdf, exe, tiff, gif, png, doc, vbs, xls, odt… etc..

Per chiarezza infatti il CNIPA ha normato il formato del nomefile in modo da conservare le informazioni sull’estensione del file originario in modo che i programmi di verifica, lettura, editing e quant’altro, potessero facilmente recuperare quest’informazione e poter così lanciare il programma più idoneo alla visualizzazione del “documento” ovvero a lanciare l’eseguibile o lo script o quant’altro.

Veniamo al dunque. Esiste un prodotto di pubblico dominio denominato OPENSSL che può essere liberamente scaricato ed utilizzato (è anche fornito come attachment di questo documento). Problema di OPENSSL è che si tratta di un prodotto altamente sofisticato che ha una tale mostruosa lista di opzioni che possono essere combinate in vari modi che il suo utilizzo da parte dei non addetti risulta piuttosto complicato. Lo utilizzerò per eseguire l’estrazione del contenuto dallla busta stessa. Supponiamo di avere un documento pippo.tif.p7m (busta crittografica) contenente un fax pippo.tif (contenuto) che l’azienda mi ha scansionato e girato in email.

La busta crittografica nel nostro esempio sarà “pippo.tif.p7m” mentre il suo contenuto (payload) che a me interessa è “pippo.tif“.

Una volta scaricato openssl.exe (che spesso viene accompagnato da alcune dll che vanno inserite tutte nella stessa dir), potremmo da linea di comando digitare:

    openssl.exe  smime -decrypt -verify -inform DER -in “pippo.tif.p7m” -noverify -out “pippo.tif”

E così finalmente otterrò il file pippo.tif libero dall’involucro (o busta crittografica) P7M.

N.B. Attenzione. Nel caso specifico in esempio, il double quote (“) NON sono necessari, ma nel caso di file con spazi questi sono obbligatori!

Spero che la frettolosa spiegazione vi sia sufficiente, ma per i curiosi  ecco come verificare che il certificato di firma non sia scaduto:

1) Estraggo il certificato e lo scrivo sul file pippo.cert

    openssl.exe pkcs7 -inform DER -print_certs -text -in “pippo.tif.p7m” -out “pippo.cert”

e successivamente, avendo ottenuto il file “pippo.cert” dovremmo dare il comando:

    openssl.exe x509 -in “pippo.cert” -subject -startdate -enddate -checkend 10 -noout

 Con questo comando otterremo le informazioni sul nome del firmatario, le due date di inizio e fine validità per le quali dovemmo verificare che l’attuale data sia compresa. Il -checkend 10 chiede ad openssl di verificare che nei prossimi 10 secondi il certificato scada.

Mancherebbe il controllo presso la CA (Certification Authoritiy) della CRL (Certification Revocation List) ove le CA sono obbligate ad inserire il certificato divenuto inattendibile per denuncia di furto/smarrimento del dispositivo di firma (token o smartcard), scadenza naturale o altri eventi accidentali.

L.R.