.Net Firma digitale con VB.Net e C# verifica firma e file

Articolo che riprende la prima parte riguardante la firma digitale, in particolare la verifica della firma, estrazione del file e le informazioni del certificato.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Introduzione

In questo articolo, riprendiamo il tema affrontato nel precedente articolo  https://www.iprogrammatori.it/articoli/programmazione/art_net-47-la-firma-digitale-tramite-dll-pks_1554.aspx nel quale aggiungiamo alle nostre applicazioni .Net, in particolare Windows Application, la gestione della firma digitale per i file.
Nel precedente articolo è stato fornito al lettore informazioni su come applicare una firma ad un file, mentre in questo vedremo come verificare la firma, ed estrare i contenuti dai file di tipo “p7m” che si sono creati, come visto nel precedente articolo.
Possiamo utilizzare il precedente progetto oppure crearne uno nuovo riguardante il modello desktop di tipo Windows Application.
Dopo aver aggiunto al progetto la libreria Pksuite come mostrato in figura 1, aggiungiamo nella nostra form, due pulsanti, uno riguardante la verifica della firma ed un altro riguardante la possibilità di estrare i file.

Figura 1 – Il riferimento alla libreria Pknet


Passiamo ora in visualizzazione codice, inseriamo lo spazio dei nomi per la gestione , qui di seguito tale dichiarazione per entrambi i linguaggi.

VB
Imports PKNETLib
Imports System.IO
Imports System.Globalization
C#
using PKNETLib;
using System.Threading;
using System.IO;
using System.Globalization;

Ora nell’evento click del pulsante per la verifica della firma dobbiamo scrivere il codice che permetterà di estrapolare le informazioni relative alla firma, quale autore, data firma, data scadenza, etc.
Qui di seguito tale dichiarazioni per entrambi i linguaggi.

VB.Net
Private Sub BtnVerifica_Click(sender As Object, e As EventArgs) Handles BtnVerifica.Click
Try
Dim fileByte As Byte() = File.ReadAllBytes("D:\Progetti\FirmaDigitale\testvb2.pdf")
Dim envelope As New Envelope()
Dim verifyInfoVerifica As New VerifyInfo()
verifyInfoVerifica = DirectCast(envelope.Verify(Nothing, fileByte), VerifyInfo)
If verifyInfoVerifica.GetSignerCount() > 0 Then
Dim testo As String = ""
For i As Integer = 0 To verifyInfoVerifica.GetSignerCount() - 1
Dim informazioniFirma As SignerInfo = DirectCast(verifyInfoVerifica.GetSigner(i), SignerInfo)
testo = "Scaduto: " + informazioniFirma.GetStatusDesc()
testo &= "Inizio Validità: " + DateTime.ParseExact(informazioniFirma.GetValidStartDate(), "yyyyMMddHHmmss", CultureInfo.CurrentCulture)
testo &= "Fine Validità: " + DateTime.ParseExact(informazioniFirma.GetValidEndDate(), "yyyyMMddHHmmss", CultureInfo.CurrentCulture)
testo &= "Ente Certificato: " + informazioniFirma.GetIssuerDN()
testo &= "Firmatario: " + informazioniFirma.GetSubjectDN()
Next
End If
Catch ex As Exception
Throw ex
End Try
End Sub
C#
private void BtnVerifica_Click(object sender, EventArgs e)
{
try
{
byte[] fileByte = File.ReadAllBytes(@"D:\Progetti\FirmaDigitale\test2.pdf");
Envelope envelope = new Envelope();
VerifyInfo verifyInfoVerifica = new VerifyInfo();
verifyInfoVerifica = (VerifyInfo)envelope.Verify(null, fileByte);
if (verifyInfoVerifica.GetSignerCount() > 0)
{
string testo = "";
for (int i = 0; i < verifyInfoVerifica.GetSignerCount(); i++)
{
SignerInfo informazioniFirma = (SignerInfo)verifyInfoVerifica.GetSigner(i);
testo = "Scaduto: " + informazioniFirma.GetStatusDesc();
testo += "Inizio Validità: " + DateTime.ParseExact(informazioniFirma.GetValidStartDate(), "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
testo += "Fine Validità: " + DateTime.ParseExact(informazioniFirma.GetValidEndDate(), "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
testo += "Ente Certificato: " + informazioniFirma.GetIssuerDN();
testo += "Firmatario: " + informazioniFirma.GetSubjectDN();
}
}
}
catch (Exception ex)
{
throw ex;
}
}

Come si vede dal frammento di codice in precedenza, da un file pdf o da un file p7m, si rilevano le informazioni del file e si passa al metodo “Verify” dell’oggetto Envelope con il quale otteniamo un oggetto di tipo VerifyInfo, che tramite il metodo GetSignerCount, ci restituisce il numero delle firme per quel file.
Se è presente almeno una firma rilevo alcune informazioni (scadenza, inizio validità etc) di tale firma tramite l’oggetto SignerInfo.

Ora vediamo come estrae i file presenti in un file di tipo “p7m”.
Nell’evento click del pulsante scriviamo il seguente codice.

VB.Net
Private Sub BtnEstraiFile_Click(sender As Object, e As EventArgs) Handles BtnEstraiFile.Click
Try
Dim fileStream As Stream = File.OpenRead("D:\Progetti\FirmaDigitale\test.p7m")
Dim envelope As New Envelope()
Dim verifyInfoVerifica As New VerifyInfo()
verifyInfoVerifica = DirectCast(envelope.VerifyFile(String.Empty, "D:\Progetti\FirmaDigitale\test.p7m", "D:\Progetti\FirmaDigitale\prova3.jpg"), VerifyInfo)
Catch ex As Exception
Throw ex
End Try
End Sub
C#
private void BtnEstraiFile_Click(object sender, EventArgs e) { try { Stream file = File.OpenRead(@"D:\Progetti\FirmaDigitale\test.p7m"); Envelope envelope = new Envelope(); VerifyInfo verifyInfoVerifica = new VerifyInfo(); verifyInfoVerifica = (VerifyInfo)envelope.VerifyFile(string.Empty, @"D:\Progetti\FirmaDigitale\test.p7m", @"D:\Progetti\FirmaDigitale\prova3.jpg"); } catch (Exception ex) { throw ex; } }

Tramite il metodo VerifyFile dell’oggetto di tipo Envelope passando come parametro, vuoto, nome del file con la firma, e percorso e nome del file che verrà generato, si crea il file, con il quale abbiamo impostato la firma.

Conclusioni

L’articolo ha voluto fornire e concludere la parte sulla gestione della firma digitale, in questa seconda parte, si è visto come verificare e rilevare le informazioni sulla firma e come estrae i file precedentemente apportati in un file di tipo “P7m”.
In questi due articoli si è visto uno dei tanti modi di come dotare le nostre applicazioni, di tipo Windows Application della firma digitale ai file.