.Net 4.7 La firma digitale tramite dll Pksuite con VB.Net e C#

In questo articolo vedremo come utilizzare le dll gratuite di Pksuite, scaricabili qui http://www.pksuite.it/ita/pr_pkboxclient.php per la gestione della firma digitale.

Nell’articolo vedremo come apportare modifiche ai file, applicando una firma digitale.
Per gestire tale scenario, il lettore dovrà avere una chiavetta di firma digitale con un certificato aggiornato, e scaricare dal sito precedentemente indicato le librerie per la gestione della firma.
Utilizzeremo tale librerie in ambiente Windows Application, versione framework 4.7 e Visual Studio 2017, tramite il linguaggio di programmazione Visual Basic .Net e C#.
Come si vede in figura 1, utilizzeremo un lettore di schede ed una card.

Figura 1 - Il lettore per la firma digitale


Creazione del progetto


Si crea un nuovo progetto di tipo “Windows Application” aggiungiamo un pulsante che permetterà di eseguire del codice per apportare la firma ai file.
Dopo aver inserito il pulsante nella form, aggiungiamo come riferimento la dll “PKsuite”, come mostrato in figura 2.

Figura 2 – Il riferimento a Pknet

Dopo aver aggiunto al progetto (Vb-Net o C#) il riferimento alla libreria Pknet, iniziamo a scrivere il codice.
Passiamo in visualizzazione codice, ed in alto sopra ad ogni dichiarazione, inseriamo lo spazio dei nomi per la gestione di tali classi e per altre informazioni.

Qui di seguito tale dichiarazione

 VB.Net
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 scriviamo il codice che permetterà di generare un file di tipo “.p7m” nel quale sarà presente il file firmato.
Ma vediamo il codice per la generazione di un file firmato tramite linguaggio di programmazione VB.Net e C#

VB.Net
Private Sub BtnFirma_Click(sender As Object, e As EventArgs) Handles BtnFirmaPdf.Click
Try
Dim envelope As New Envelope()
envelope.SetOption("VALID_CRED_FILTER", 0)
envelope.SetOption("ADD_TIME_STAMP", 0)
envelope.SetOption("ENCODING", 1)
envelope.SetOption("CRED_TYPE_FILTER", 1)
envelope.StartTransaction()
Dim dataFirma As DateTime = DateTime.Now
Dim percorsoNomeFile As String = "D:\Progetti\FirmaDigitale\test.pdf"
Dim infoFile As New FileInfo(percorsoNomeFile)
If infoFile.Extension.ToLower().Equals(".pdf") Then
envelope.PDFSignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + "vb2.pdf", String.Empty, String.Empty, String.Empty, String.Empty, _
dataFirma)
Else
envelope.SignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + "vb.p7m", String.Empty, dataFirma)
End If
envelope.EndTransaction()
Catch ex As Exception
Throw ex
End Try
End Sub
C#
private void BtnFirma_Click(object sender, EventArgs e)
{
try
{
Envelope envelope = new Envelope();
envelope.SetOption("VALID_CRED_FILTER", 0);
envelope.SetOption("ADD_TIME_STAMP", 0);
envelope.SetOption("ENCODING", 1);
envelope.SetOption("CRED_TYPE_FILTER", 1);
envelope.StartTransaction();
DateTime dataFirma = DateTime.Now;
string percorsoNomeFile = @"D:\Progetti\FirmaDigitale\test.jpg";
FileInfo infoFile = new FileInfo(percorsoNomeFile);
if (infoFile.Extension.ToLower().Equals(".pdf"))
{
envelope.PDFSignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + "2.pdf", string.Empty, string.Empty, string.Empty, string.Empty, dataFirma);
}
else
{
envelope.SignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + ".p7m", string.Empty, dataFirma);
}
envelope.EndTransaction();
}
catch (Exception ex)
{
throw ex;
}
}

Come si vede dal precedente frammento di codice, si crea un oggetto di tipo Envelope, con il quale impostiamo alcuni parametri, per non visualizzare a video la schermata della verifica del certificato e la data di file.

Tramite il metodo SignfileEx creo il file di tipo p7m nel quale ci sarà il file che vorrei firmare.
Il primo parametro di questo metodo, riguarda il file di origine, il secondo parametro il percorso e nome file da creare relativo alla firma digitale, nome della firma e data firma.
Nel caso che invece vogliamo firmare solo file di tipo pdf, il codice sarà come riportato qui di seguito.

VB.Net
Private Sub BtnFirma_Click(sender As Object, e As EventArgs) Handles BtnFirmaPdf.Click
Try
Dim envelope As New Envelope()
envelope.StartTransaction()
Dim dataFirma As DateTime = DateTime.Now
Dim percorsoNomeFile As String = "D:\Progetti\FirmaDigitale\test.pdf"
Dim infoFile As New FileInfo(percorsoNomeFile)
If infoFile.Extension.ToLower().Equals(".pdf") Then
envelope.PDFSignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + "vb2.pdf", String.Empty, String.Empty, String.Empty, String.Empty, _
dataFirma)
Else
envelope.SignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + "vb.p7m", String.Empty, dataFirma)
End If
envelope.EndTransaction()
Catch ex As Exception

Throw ex
End Try
End Sub
C#
private void BtnFirma_Click(object sender, EventArgs e)
{
try
{
Envelope envelope = new Envelope();
envelope.StartTransaction();
DateTime dataFirma = DateTime.Now;
string percorsoNomeFile = @"D:\Progetti\FirmaDigitale\test.jpg";
FileInfo infoFile = new FileInfo(percorsoNomeFile);
if (infoFile.Extension.ToLower().Equals(".pdf"))
{
envelope.PDFSignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + "2.pdf", string.Empty, string.Empty, string.Empty, string.Empty, dataFirma);
}
else
{
envelope.SignFileEx(percorsoNomeFile, Path.GetDirectoryName(percorsoNomeFile) + "\\" + Path.GetFileNameWithoutExtension(percorsoNomeFile) + ".p7m", string.Empty, dataFirma);
}
envelope.EndTransaction();
}
catch (Exception ex)
{
throw ex;
}
}

Conclusioni


In questo articolo introduttivo il lettore potrà avvicinarsi al mondo della firma digitale, utilizzando il codice .Net e le librerie Pksuite. Dopo aver installato sdk, i driver, ed aver a disposizione, chiavetta e certificati per la firma digitale, l’utilizzo è molto semplice.
L’articolo ha voluto fornire informazioni sulla firma di qualsiasi file generando file di tipo “p7m” e la firma digitale per tutti quei file di tipo “pdf”