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.
6 commenti:
Ciao Emanuele, l'articolo è bello, interessante e anche semplice. Purtroppo credo che la libreria non sia più gratuita, perché mi dice 'La licenza PkNet non permette le transazioni!'
Ho scritto comunque nel forum. Ciao.
Buongiorno Piero,
bisogna avere una licenza per utilizzarla, che può essere anche dimostrativa, mentre il pacchetto è free.
Dove hai scritto?
Ciao Emanuele, non riesco a trovare la libreria su citata nei pacchetti NuGet. Sai se esiste ancora? Grazie
Ciao Daniele,
su NuGet, non c'è, devi andare nel sito ufficiale e scaricare il pacchetto gratuito.
Ho parlato con la società. Il pacchetto non è gratuito è dimostrativo e dura 30 gg
Grazie Mauro,
quindi sdk non è più gratuito?
Emanuele
Posta un commento