venerdì 6 agosto 2021

C# firma digitale estrapolare il file firmato digitalmente .p7m con .Net 5.0

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_c-net-50-estrapolare-il-file-firmato-digitalmente-p7m-_1742.aspx 


In questo articolo vedremo come rilevare i file firmato digitalmente che viene generato con l’estensione “.p7m” senza utilizzare componenti di terze parti ma le classi messe a disposizione dal Framework 5.0.


L’articolo si basa in ambito di Windows application con il linguaggio di programmazione C#, tramite Visual Studio 2019 community.


Vediamo come poter estrapolare dal file firmato digitalmente, con estensione p7m il relativo file originale.


Creazione del progetto


Si crea un nuovo progetto di tipo “Windows Application” selezionando come versione del Framework 5


Dopo aver creato il progetto, aggiungiamo nella form un controllo di tipo “Label” con il quale andremo a scrivere una descrizione, due controlli di tipo “Button” ed un controllo di tipo “Casella di testo”.


Un pulsante avrà la funzionalità di aprire una finestra per la selezione dei file di tipo “.p7m” mentre un altro pulsante, permetterà di estrapolare il contenuto nel file nella cartella in cui gira l’applicativo.


La form sarà simile come quella mostrata in figura 1.


Figura 1 – I controlli posizionati nella form






Il controllo Label avrà il testo con scritto “Percorso e nome file:” mentre il pulsante dei tre puntini, avrà la proprietà Name impostata su “BtnSelezionaFile”. Il controllo TextBox avrà impostata la proprietà “Name” con il valore “TxtPercorsoNomeFile” ed infine il pulsante posizionato in basso con il testo “Esporta File” avrà impostata la proprietà “Name” con il valore “BtnEsporta”.




Stesura del codice


Passiamo ora alla stesura del codice, facciamo doppio click sul pulsante dei tre punti, in questo modo passiamo in visualizzazione codice.




Nell’evento click del pulsante, scriviamo il codice per visualizzare a video una finestra che permette di selezionare i file che sono di tipo “.p7m”, il tutto tramite la classe “openFileDialog”.


Qui di seguito le suddette operazioni.




C#


private void BtnSelezionaFile_Click(object sender, EventArgs e)


        {


            OpenFileDialog fileDialog = new OpenFileDialog();


            fileDialog.Filter = "File p7m (*.p7m)|*.p7m";


            if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)


            {


                TxtPercorsoNomeFile.Text = fileDialog.FileName;


            }


        }








Ora passiamo in visualizzazione grafica, e proviamo a fare una prova per vedere se la finestra di selezione file funziona.


Facciamo doppio click sul pulsante con la dicitura “Esporta File”, in questo modo viene visualizzata la parte di codice relativo all’evento click, sopra, nella parte dei namespace, dobbiamo aggiungere quelli per la gestione dei file e della crittografia.


Qui di seguito le suddette operazioni.




C#


using System.IO;


using System.Security.Cryptography.Pkcs;




Restando sempre in visualizzazione codice, andiamo nella parte del codice relativo all’evento click del pulsante per esportare i file, e scriviamo il codice per leggere nei file p7,.


Faremo uso della classe “SignedCMS” che tramite metodi e proprietà possiamo ottenere il file.


Qui di seguito il frammento di codice, che estrapola dal file di tipo “p7m” il suo contenuto e lo salva nella cartella dove viene eseguito il programma.


C#

private void BtnEsporta_Click(object sender, EventArgs e)

        {

            try

            {

                if (TxtPercorsoNomeFile.Text.Trim() == "")

                {

                    MessageBox.Show("Selezionare un file firmato digitalmente, di tipo p7m");

                }

                byte[] FileFirmatoP7m = File.ReadAllBytes(TxtPercorsoNomeFile.Text);

                if (FileFirmatoP7m == null)

                    throw new ArgumentNullException("Errore nel file firmato selezionato.");

                //Uso la classe per estrapolare il fle

                SignedCms cmsFirmato = new();

                cmsFirmato.Decode(FileFirmatoP7m);

                if (cmsFirmato.Detached)

                    throw new InvalidOperationException("Errore nella fase di estrapolazione del contenuto dal file firmato.");

                //Estrapola l'array byte del file firmato

                byte[] FileRilevato = cmsFirmato.ContentInfo.Content;


                //Nome del file che viene generato

                string NomeFileDaCreare = new FileInfo(TxtPercorsoNomeFile.Text).Name.Replace(new FileInfo(TxtPercorsoNomeFile.Text).Extension, "");


                File.WriteAllBytes(Environment.CurrentDirectory + "\\" + NomeFileDaCreare, FileRilevato);



            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }






Conclusioni


In questo articolo abbiamo visto come possiamo dotare le nostre applicazioni della possibilità di estrapolare in un file firmato digitalmente il suo contenuto, e quindi rilevare il file e poterlo aprire con il programma installato sul proprio pc. Può tornare utile anche nell’eventualità che si vuole realizzare un programma per la gestione della firma elettronica.

Nessun commento: