C# firma digitale estrapolare il certificato da un file firmato p7m

Articolo sulla firma digitale che fornisce una tecnica sulla gestione dei certificati del file firmato.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo riprendiamo il tema della firma digitale che permette di fornire ai file o meglio documenti un valore legale, le informazioni riguardano l’ultima tecnologia .Net, versione 5 del Framework, tramite il linguaggio di programmazione C#.
In questo articolo vedremo come da un file firmato digitalmente di tipo “.p7m” è possibile estrapolare il certificato e salvarlo sul proprio pc, il tutto utilizzando le classi che mette a disposizione il Framework .Net 5.
Lo sviluppo avviene tramite l’ambiente di sviluppo Visual Studio 2019 Community e di tipo Windows Application, ma si può adattare lo scenario anche in ambito web e su altre versioni di Framework e Visual studio.

Creazione del progetto

Si crea un nuovo progetto di tipo Windows Framework, selezionando come linguaggio C# e versione 5 del Framework.
Nella form, inserire un controllo textbox, una label che sarà utilizzata come intestazione e due pulsanti. Un pulsante avrà la funzione di visualizzare a video una dialog per selezionare il file selezionato, che imposteremo la proprietà “Name” in “BtnSelezionaFileFirmato” mentre un altro pulsante avrà il compito di estrapolare il certificato e salvarlo nella cartella in cui viene eseguito l’applicativo ed avrà la proprietà “Name” impostato su “BtnEstrapolaCertificato”, il tutto come mostrato in figura 1.
Infine il controllo casella di testo, avrà impostato la proprietà “Name” sul valore “TxtPercorsoNomeFileFirmato”.

Figura 1- La form per estrapolare il certificato


Stesura del codice

Terminata la parte relativa alla creazione dell’interfaccia e della predisposizione dei vari controlli passiamo nella stesura del codice.
Facciamo doppio click sul pulsante relativo con i tre punti, quello accanto alla casella di testo in modo che passiamo in visualizzazione codice nell’evento click del pulsante.
In questo evento viene visualizzata una finestra per la selezione dei file firmati digitalmente che hanno estensione di tipo “.p7m” e riporta il nome e percorso del file nella casella di testo.
Qui di seguito il frammento di codice delle suddette operazioni.

C#
private void BtnSelezionaFileFirmato_Click(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Title = "Seleziona file firmato";
fileDialog.Filter = "file firmato (*.p7m)|*.p7m";
if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
TxtPercorsoNomeFileFirmato.Text = fileDialog.FileName;
}
}

Rimanendo sempre in modalità codice, scriviamo la funzione che ci permette di estrapolare il certificato dal file selezionato. La funzione restituisce un array di byte che è il binario, ossia contenuto del certificato che sarà utilizzato per crearlo.

Per la gestione dei certificati, dobbiamo utilizzare lo spazio dei nomi “X509Certificates” che fornisce una serie di classi che permettono di gestire i certificati.
In alto, nella dichiarazione di altri spazio dei nomi, inseriamo quello per i certificati, qui di seguito il frammento di codice.

C#
//Spazio dei nomi per la gestione del certificato
using System.Security.Cryptography.X509Certificates;

Terminata l'aggiunta dello spazio dei nomi, scriviamo la funziona che estrapola il certificato in forma di array byte.
Utilizzando la classe X509Certificate possiamo gestire i certificati, dopo aver inizializzato la classe con il percorso e nome del file, tramite il metodo “Export” passando come parametro “Cert” dell’enumerazione di tipo di certificato, otteniamo l’array byte del certificato contenuto nel file firmato digitalmente.
Qui di seguito le suddette operazioni.

C#
private byte[] GetCertificatoDaFile(string PercorsoNomeFile)
{
try
{
X509Certificate Certificato = new X509Certificate(PercorsoNomeFile);
byte[] CertificatoReturn = null;
CertificatoReturn = Certificato.Export(X509ContentType.Cert);
return CertificatoReturn;
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
return null;
}
}

A questo punto, terminata la creazione del metodo per estrapolare il certificato, torniamo in visualizzazione grafica, dove facciamo doppio click sul pulsante “Estrapola certificato” con il quale passiamo alla funzione che abbiamo appena scritto il percorso e nome del file, la funzione ci restituisce un array di byte con il quale andremo a creare il certificato nella stessa cartella in cui viene seguito l’applicativo.

Facciamo doppio click sul pulsante, in modo che passiamo in visualizzazione codice dell’evento click del pulsante, e scriviamo il codice qui di seguito delle suddette operazioni.
Prima di scrivere il codice per l’evento click del pulsante, occorre inserire lo spazio dei nomi per la gestione dei file, in particolare per la creazione dei file.
Qui di seguito la dichiarazione dello spazio dei nomi per la gestione dei file e cartelle da mettere insieme ad altri namespace.

C#
using System.IO;


Ritornando all’evento click del codice, scriviamo il codice per invocare la funzione creata in precedenza e creare il certificato.

C#
private void BtnEstrapolaCertificato_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(TxtPercorsoNomeFileFirmato.Text.Trim()))
{
MessageBox.Show("Selezionare un file firmato di tipo .p7m");
return;
}
var risultato = GetCertificatoDaFile(TxtPercorsoNomeFileFirmato.Text);
if (risultato == null)
{
MessageBox.Show("Impossibile estrapolare il certificato");
return;
}
string percorsoFile = Environment.CurrentDirectory + "\\CertificatoRilevato.cer";
//Creo il certificato
File.WriteAllBytes(percorsoFile, risultato);
//lo apro
System.Diagnostics.Process.Start(percorsoFile);
}

Conclusioni

L’articolo ha voluto fornire al lettore alcuni aspetti della firma digitale e di come dotare le proprie applicazioni di funzionalità avanzate nella gestione dei file firmati digitalmente di tipo p7m. La gestione dei file firmati è sempre più richiesta vista l’evoluzione tecnologia negli ultimi anni e soprattutto di evitare quanto più possibile la carta e quindi effettuare tutte le operazioni legali ed amministrative in forma digitale.
Nel sito è possibile consultare altri articoli sulla firma digitale, fornendo una panoramica che affronta vari ambiti questo genere di applicazioni.