Estrazione xml da file p7m

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

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:

1 Mi Piace

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

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.

2 Mi Piace

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

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

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.

hmmm allora ricordavo male. Devo provare.
Grazie

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).

Salve ragazzi,
Oggi una fattura firmata mi ha dato il seguente errore “Dati ASN1 Danneggiati”, Cosa vuol dire?

Chi o cosa ti ha dato quell’errore?
ASN1 è il formato (binario) dei file .p7m (CAdES-BES), quindi il messaggio indica che c’è qualcosa che non va col file. Potrebbe essere il caso già discusso di file .p7m codificato in base64, mentre la procedura a cui l’hai dato in pasto si aspetta un file binario. Oppure il file è veramente rovinato.

L’errore me l’ha dato la funzione Decode di SignedCms.
Credo che sbaglio qualcosa, mi puoi dire dove:
Leggo il file p7m, lo converto in byte e lo passo alla funzione che hai pubblicato EstraiFileDaP7m.
Da quello che ho capito dovrei decodificare in base64, grazie in anticipo.

se carichi il file o lo metti a disposizione su google drive vediamo se ti possiamo dare una mano a capire l’errore.

Hai controllato se il file codificato in base64? Se lo è, devi decodificarlo prima di passarlo alla funzione EstraiFileDaP7m, altrimenti no.

Noi abbiamo sviluppato uno script che scarica le fatture presenti nel Cassetto Fiscale e può automaticamente sbustarle (estrarre xml da p7m) tramite openssl

hmmm le scarica dal Cassetto Fiscale in che modo, se posso chiederlo? Perchè non esistendo API o altro l’unica è procedere simulando un accesso “fisico” dell’utente, giusto?

1 Mi Piace

Esatto, lo script openasource che forniamo, espone tramite API REST l’accesso ai dati presenti nel proprio Cassetto Fiscale.