sabato 17 marzo 2018

.Net 4.7 firma digitale in VB.Net e C# tramite PkNet

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_net-47-la-firma-digitale-tramite-dll-pks_1554.aspx

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”

6 commenti:

Anonimo ha detto...

Ciao, ho cercato la libreria ma non si trova da nessuna parte, da dove l'hai trovata?

Emanuele ha detto...

Ciao,
la libreria l'ha trovi qui http://www.pksuite.it/ita/downloads.php

Ciao

Anonimo ha detto...

Ciao,
Ho provato a installare il tutto e ad eseguire il codice di esempio, ma al momento dell'esecuzione mi dice che la licenza non è valida, è necessario acquistarla?
mille grazie
Raffa

Emanuele ha detto...

Ciao Raffa,
dovresti farti rilasciare dal sito la licenza, che è a pagamento.
Fammi sapere come va.

Unknown ha detto...

Ciao Emanuele,
ho contattato il fornitore che gentilmente mi ha fornito una licenza trial del software…. ora vediamo se riesco a implementare qualcosa di buono :-)

Emanuele ha detto...

Tienimi aggiornato.
Grazie
Emanuele