eniocarboni / p7m

p7m è uno script per la gestione dei file con firma digitale nel formato CADES
https://quoll.it/firma-digitale-p7m-come-estrarre-il-contenuto/
GNU General Public License v3.0
48 stars 5 forks source link

Openssl Verification failure #7

Closed v-giacomini closed 5 years ago

v-giacomini commented 5 years ago

Salve, ho una fattura elettronica per cui openssl e quindi p7m non riescono a verificare la firma elettronica. La verifica dei certificati non ha problemi e quindi usare l'opzione -noverify non ha effetto. Invece usando l'opzione -nosigs sono in grado di estrarre il contenuto, ma al costo di non verificare la firma che è di fondamentale importanza poiché trattasi di una fattura.

La prima cosa che ho pensato è che il file fosse corrotto, quindi dopo averlo riscaricato direttamente dalla PEC più volte ho provato ad eseguire la verifica manuale della firma passo passo seguendo la sua guida: https://quoll.it/p7m-viewer-firma-digitale-parte-seconda/ e purtroppo la verifica è andata a buon fine.

Il software Dike6 (https://www.firma.infocert.it/installazione/software.php) verifica correttamente il file, e provando a modificare qualche valore al suo interno si accorge della modifica e mostra un errore, mentre openssl col parametro -nosigs no.

L'output è:

Openssl Verification failure 140310115541440:error:04091068:rsa routines:int_rsa_verify:bad signature:../crypto/rsa/rsa_sign.c:220: 140310115541440:error:21071069:PKCS7 routines:PKCS7_signatureVerify:signature failure:../crypto/pkcs7/pk7_doit.c:1035: 140310115541440:error:21075069:PKCS7 routines:PKCS7_verify:signature failure:../crypto/pkcs7/pk7_smime.c:353:

Questo problema sembra simile a quello nella issue #4

eniocarboni commented 5 years ago

Da quel che posso capire, come nell'issue #4, non è un errore sulla firma vera e propria ma su i dati che vengono considerati per la firma. Il problema dovrebbe esser nato con openssl versione successive a 1.0.2 che non rispettavano esattamente l'RFC5485. Per capire meglio vedere tutto il thread dei messaggi a partire da https://www.mail-archive.com/openssl-users@openssl.org/msg85901.html Provando la versione openssl 1.0.2r in un mio p7m con tale problema la verifica risulta positiva. Quindi si potrebbe installare tale versione in parallelo per questi casi. Come fare:

cd $HOME
mkdir -p src
cd src
wget --no-check-certificate https://www.openssl.org/source/openssl-1.0.2r.tar.gz
tar xzvf openssl-1.0.2r.tar.gz
cd openssl-1.0.2r/
./config --prefix=$HOME/openssl102r
make
make test
make install
cd $HOME
alias "openssl=$HOME/openssl102r/bin/openssl"
export LD_LIBRARY_PATH=$HOME/openssl102r/lib

Facciamo il test di versione con openssl version e quindi verifichiamo il p7m al solito modo @v-giacomini riusciresti a verificare che con la versione 1.0.2r di openssl il problema non esiste?

v-giacomini commented 5 years ago

Grazie per la risposta, confermo che la versione 1.0.2r verifica con successo il file in questione.

Tuttavia ho cercato informazioni sulla compatibilità di openssl con CAdES e ho trovato questo articolo https://www.blia.it/firmadigitale/ che mi ha portato a questa pull request https://github.com/openssl/openssl/pull/7893.

Ho quindi provato a usare il comando cms di openssl e sono riuscito a verificare il file (openssl versione 1.1.0) usando il parametro -no_attr_verify, quindi il comando completo che ho usato è: openssl cms -verify -inform DER -CAfile xxxx.pem -in xxxxxxxx.xml.p7m -no_attr_verify.

Non ho trovato sufficienti informazioni sul parametro -no_attr_verify e quindi non so quali siano le conseguenze del suo utilizzo, ma credo che almeno per quanto riguarda le fatture elettroniche la strada da seguire sia un'altra, perché ho l'impressione che ci saranno altri file con altri problemi.

Ora sto raccogliendo informazioni (https://github.com/esig/dss)

eniocarboni commented 5 years ago

Grazie @v-giacomini, la pull su openssl https://github.com/openssl/openssl/pull/7893#issue-238495521 a cui fai riferimento serve per poter firmare correttamente i CAdES ma non per la verifica della firma. Come chiusura di questa issue metto il commit openssl dopo il quale il problema si manifesta per alcuni p7m firmati ma non perfettamente compatibili con PKCS1 V1.5 dove si può capire bene il problema di compatibilità: https://github.com/openssl/openssl/commit/608a026494c1e7a14f6d6cfcc5e4994fe2728836