menu di navigazione del network

Estrazione xml da file p7m


(Pierluigi leone) #1

Buonasera a tutti,
magari qualcuno di voi usa openSSL per estrarre la fattura xml da un file firmato dall’emittente della fattura (non il file enc dell’SdI ma proprio la fattura firmata) e mi può aiutare.
Ho creato il software che cerca di estrarre il suddetto xml utilizzando questo comando openSSL:
smime -decrypt -verify -in e:\ITxxxxxxxxxxxx.p7m -inform der -binary -out e:\ITxxxxxxxxxxxxxxx.xml -noverify"

Il problema è che spesso fallisce dandomi un errore che allego
errore%20SMIME1
A completezza dell’informazione aggiungo che si apre normalmente con il dike 6 (e non mi sembrano file strani).

Qualche idea che possa aiutarmi?
Grazie


(Vladan Bato) #2

Probabilmente il file è codificato in base64. In questo caso devi prima fare la decodifica base64 e poi l’estrazione dal p7m come sopra.
Puoi fare anche la decodifica base64 con openssl. Vedi questo mio post:


(Pierluigi leone) #3

Ottimo suggerimento. Sviluppo in c# e la fatturazione elettronica ormai mi ha abituato a decodificare in base64 (gli attachment) :slight_smile:

Grazie mille, faccio subito una prova


(Vladan Bato) #4

Ho visto nell’altro thread che usi C#. Puoi fare tutto in .NET senza altre librerie. Per estrarre il contenuto del .p7m (dopo aver decodificato l’eventuale base64) puoi usare la seguente funzione:

    private byte[] EstraiFileDaP7M(byte[] signedData)
    {
        SignedCms cms = new SignedCms();
        cms.Decode(signedData);

        if (cms.Detached) {
            throw new InvalidOperationException("Cannot extract enveloped content from a detached signature.");
        }

        return cms.ContentInfo.Content;
    }

La classe SignedCms sta in System.Security.Cryptography.Pkcs.


(Pierluigi leone) #5

hmmm vado a memoria ma mi sa che è disponibile solo dal framework 4.7.2 ed io sono su un software sviluppato sulla 4.5.2


(Vladan Bato) #6

Io l’ho testato su .NET 4.7, ma stando alla documentazione, dovrebbe essere disponibile su tutte le versioni.


(Romolo Manfredini) #7

Confermo, addirittura dalla versione 2.0 del .NET.
Chilkat ha invece parecchi vantaggio nella parte di firma dato che produce sia xades che pades che cades.


(Pierluigi leone) #8

hmmm allora ricordavo male. Devo provare.
Grazie


(Pierluigi leone) #9

E ti ringrazio tantissimo! Grazie al suggerimento della codifica in base64 e a questo pezzo di codice ho risolto il problema (ed in più ho eliminato la dipendenza ad openSSL che, per quanto ottimo, è sempre un elemento esterno).