File p7m contenenti file binario

in php la decodifica del p7m non è difficile, ho postato le istruzioni qui sul forum.
E la decodifica del base64 è alquanto banale…

posso chiedere una cortesia. Nel sito dell’Agenzia riesco a creare il pdf delle fatture ricevute in formato xlm ma non quelle in formato p7m. Sapete aiutarmi come e dove posso trovare uno strumento per creare il pdf? Grazie mille

Scusami ma non so se ho capito bene, intendi uno strumento esterno oppure una procedura (magari in c# o altro in .NET) da includere nel vostro software?
Nel primo caso ti basta scaricare il dike (che è gratuito).
Nel secondo caso, eventualmente, ti posso postare la procedura per estrarre il contenuto del file p7m (poi, per la conversione da xml a pdf ti conviene trasformarlo in html, usando un css che più ti aggrada, e da li al pdf è un attimo con i mille tool dipsonibili)

Salve,
per risolvere anche un altrro problema sugli zip adesso i file mi arrivano ancora su un server Unix ma li decripto e decomprimop su un server linux.
Quindi se ho capito bene dovrei togliere tutti i CR con il sed e portare il file su una sola riga, poi lanciare openssl base64 -A.
Corretto?

Sarebbe openssl base64 -d -A.
La prima cosa che devi fare è capire se il file è codificato in base64, poi:

  • Se è codificato in base64, esegui il comando cat IT12345678901_XXXXX.xml.p7m | tr -d '\r\n' | openssl base64 -d -A | openssl smime -verify -inform DER -noverify -out IT12345678901_XXXXX.xml
  • Se non è codificato in base64 (quindi è un p7m vero), esegui openssl smime -verify -inform DER -noverify -in IT12345678901_XXXXX.xml.p7m -out IT12345678901_XXXXX.xml

Salve Vladan,
ho lo stesso problema di Simocigni.
Il file che devo convertire è effettivamente in formato base64.
Se eseguo:
openssl base64 -d -A -in nomefileP7M -out nomefileXML
crea effettivamente il file xml, ma contiene dei caratteri strani all’inizio e alla fine e qualche carattere strano è sparso nell’xml.
Ho provato a eseguire il comando che suggerivi:
cat nomefileP7M | tr -d ‘\r\n’ | openssl base64 -d -A | openssl smime -verify -inform DER -noverify -out nomefileXML
Ma la risposta è:
| non atteso
Puoi aiutarmi? Grazie in anticipo Paola

Salve,
non importa perdiate tempo a rispondermi. Grazie lo stesso Paola

Scusate avevo dimenticato dirvi che ho risolto. saluti Paola

Buongiorno
stiamo verificando un problema similare dove però il file non è codificato BASE64. DIKE estrae l’XML senza problemi mentre openSSL va in errore:
openssl smime -verify -in C:\OpenSSL-Win64\bin\actalis.p7m -inform DER -noverify -out C:\OpenSSL-Win64\bin\actalis.xml

8552:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto\asn1\tasn_dec.c:1130:
8552:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:290:Type=PKCS7_ISSUER_AND_SERIAL
8552:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:627:Field=issuer_and_serial, Type=PKCS7_SIGNER_INFO
8552:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:596:Field=signer_info, Type=PKCS7_SIGNED
8552:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:627:
8552:error:0D08403A:asn1 encoding routines:asn1_template_ex_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:477:Field=d.sign, Type=PKCS7
L’errore è sistematico e solo -al momento- su pacchetti firmati da certificato emesso da Actalis (Aruba). Ecco il file per chi volesse darmi una mano: https://maranmichele-my.sharepoint.com/:f:/g/personal/maranmichele_maranmichele_it/EisGPUW-6RlHt9PAIzXvmtEB_MCJZk5uQ4V-rtB_R3ZeXg?e=lbM5WDù
Qualche idea?
Grazie

Ciao. Usando il comando “openssl cms” invece di “openssl smime” dovrebbe funzionare. I due comandi fanno più o meno la stessa cosa, ma il comando cms “digerisce” una varietà più ampia di file.
Maggiori informazioni qui:

3 Mi Piace

Direi perfetto. Funziona a meraviglia.
Grazie mille per il suggerimento.
Buona continuazione

Confermo, funziona!

Ho avuto lo stesso problema con tutte le fatture provenienti da Enel Energia SpA.
Fino a gennaio funzionava openssl smime
Da febbraio ha iniziato ad uscire
Error reading S/MIME message
ASN1_CHECK_TLEN wrong tag tasn_dec.c

Aggiornando OpenSSL e modificando il bat sostituendo
"C:\Program Files (x86)\GNU\openssl-0.9.8h-1-bin\bin\openssl.exe" smime -verify -in %1 -inform der -noverify -signer "%~dp1%filename%.cert.pem" -out "%~dp1%filename%"
con
"C:\Program Files (x86)\GNU\openssl-1.0.2u-x64_86-win64\openssl.exe" cms -verify -in %1 -inform der -noverify -signer "%~dp1%filename%.cert.pem" -out "%~dp1%filename%"
ora funziona anche con le fatture di Enel Energia SpA

Ho lo stesso problema con fatture Enel Energia

lancio il comando
openssl smime -verify -noverify -in file.p7m -inform DER -out file.xml 2>&1

Mi restituisce l’errore
Error reading S/MIME message
11108:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:.\crypto\asn1\tasn_dec.c:1316:
11108:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:.\crypto\asn1\tasn_dec.c:380:Type=PKCS7_ISSUER_AND_SERIAL
11108:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:.\crypto\asn1\tasn_dec.c:748:Field=issuer_and_serial, Type=PKCS7_SIGNER_INFO
11108:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:.\crypto\asn1\tasn_dec.c:709:Field=signer_info, Type=PKCS7_SIGNED
11108:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:.\crypto\asn1\tasn_dec.c:748:
11108:error:0D08403A:asn1 encoding routines:ASN1_TEMPLATE_EX_D2I:nested asn1 error:.\crypto\asn1\tasn_dec.c:578:Field=d.sign, Type=PKCS7

Qualcuno sa darmi qualche dritta? :sweat_smile:

ho aggiornato openssl e cambiato in
openssl cms -verify -noverify -in 'file.p7m -inform DER -out file.xml 2>&1

grazie grazie

Ciao anche io ho problemi con le fatture di Enel Energia!
Ma ahimè non riesco a far funzionare openssl con PHP ma uso la funzione PHP:

@$output = openssl_pkcs7_verify ($randomName . ".p7m-b6m" , PKCS7_NOVERIFY , null ,array('CA.pem'), 'CA.pem', $randomName . 'cleaned.xml');

La funzione mi funziona con tutte le fatture ma non con Enel. Qualcuno nel mio stesso problema?

ciao per caso conosci un equivalente per puro php? attualmente uso

openssl_pkcs7_verify 

vedi risposta precedente, ma ahimè con fatture di Enel non mi va…

No, mi dispace. Non uso PHP e nemmeno OpenSSL. Ho solo fatto dei test con openssl a riga di comando e constatato che con openssl cms funziona, mentre con openssl smime no.
Da quello che posso vedere PHP purtroppo non espone tutte le funzioni di OpenSSL. L’unica soluzione sembra essere quella di eseguire openssl con exec.
Se proprio non puoi eseguire programmi esterni e non trovi una libreria già pronta, e tutto quello che ti interessa è estrarre il file xml (senza fare la verifica della firma), puoi provare a implementare da solo la procedura.
E’ quello che abbiamo fatto noi. Non è semplicissimo, ma neanche impossibile. Vedi questo mio post:

Salve a tutti,
io ho ricevuto una fattura p7m, in formato cades (firma all’inizio e fine del file, caratteri “sballati” in mezzo all’xml, ma sostanzialmente si legge la p.iva). Il problema è che sia con dike, sia sul sito del notariato, sia usando openssl in tutte le forme (con -smime o -cms) dà sempre errore (asn1 encoding routines:ASN1_get_object:header too long:asn1_lib.c:157). Inoltre io sviluppo in java e avrei bisogno di estrarre il file xml pulito in modo da poterlo parsare con librerie DOM. Conoscete qualche rimedio a questo problema? o l’unica speranza è un metodo euristico che “pulisce” il file per ottenere un xml ? Grazie per le eventuali risposte

Che openssl cms abbia problemi potrebbe succedere, ma che nemmeno tool specifici come Dike riescano a leggerlo, è molto strano.
Il file arriva dal SdI? Sei sicuro che non sia rovinato?
Hai provato a riscaricarlo dal portale F&C?

Ottieni lo stesso errore anche se provi a fare il parsing dell’ASN1 con openssl?
openssl asn1parse -inform DER -i -in nomefile.p7m

Avevo una errore simile ed il primo comando ha funzionato.
Sconoscevo la possibilità che i file firmati in p7m potessero essere in base64. Ma, che voi sappiate, questo dipende dal client di firma o è un opzione data all’utente?