lunedì 26 marzo 2018

.Net Firma digitale verifica della firma e file

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_net-firma-digitale-con-vbnet-e-c-verific_1555.aspx


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:

Piero Sbressa ha detto...

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.

Emanuele Mattei ha detto...

Buongiorno Piero,
bisogna avere una licenza per utilizzarla, che può essere anche dimostrativa, mentre il pacchetto è free.
Dove hai scritto?

Daniele ha detto...

Ciao Emanuele, non riesco a trovare la libreria su citata nei pacchetti NuGet. Sai se esiste ancora? Grazie

Emanuele Mattei ha detto...

Ciao Daniele,
su NuGet, non c'è, devi andare nel sito ufficiale e scaricare il pacchetto gratuito.

MAURO AMORE ha detto...

Ho parlato con la società. Il pacchetto non è gratuito è dimostrativo e dura 30 gg

Emanuele ha detto...

Grazie Mauro,
quindi sdk non è più gratuito?

Emanuele