lunedì 19 ottobre 2026

C# Windows Forms: verificare la scadenza del certificato di un file firmato digitalmente (.p7m)

Quando si lavora con documenti firmati digitalmente, può essere utile verificare se il certificato digitale utilizzato dal firmatario ha superato la propria data di scadenza.

In questo articolo vedremo come effettuare questo controllo utilizzando le classi messe a disposizione dal framework .NET, senza ricorrere a librerie di terze parti.

Verificare la data di scadenza del certificato
.NET mette a disposizione la classe X509Certificate2, che consente di accedere alle informazioni contenute in un certificato X.509, tra cui la data di inizio e di fine validità.

La proprietà NotAfter, in particolare, restituisce la data di fine validità del certificato.

Il seguente frammento di codice mostra come confrontare tale data con quella corrente: 

C#

X509Certificate2 certificato = new X509Certificate2(PercorsoNomeFileP7m)

DateTime oggi = DateTime.Now;

if (oggi > certificato.NotAfter)

{

    MessageBox.Show($"Il certificato è SCADUTO.\nData di scadenza: {certificato.NotAfter}",

        "Certificato Scaduto", MessageBoxButtons.OK, MessageBoxIcon.Error);

    return;

}

 

Nell'esempio, PercorsoNomeFileCertificato rappresenta il percorso del file contenente il certificato X.509.

Se la data corrente è successiva alla data indicata dalla proprietà NotAfter, il certificato viene considerato scaduto.

Nota: il codice mostrato verifica esclusivamente la data di scadenza del certificato. Non controlla, da solo, la validità complessiva del certificato né l'autenticità della firma digitale.

domenica 18 ottobre 2026

C# Firma digitale Windows Forms: estrarre un certificato digitale da un file P7M

In questo esempio vediamo come estrarre un certificato digitale da un file firmato digitalmente in formato .p7m, utilizzando il linguaggio C# e l'ambiente Windows Forms.

Un file P7M può contenere uno o più certificati. Vedremo quindi come recuperare i certificati presenti nella firma e come salvare un certificato in un file con estensione .cer.

1. Estrarre i certificati dal file P7M

Per prima cosa, creiamo una funzione che legge il file P7M e restituisce un oggetto X509Certificate2Collection, contenente i certificati inclusi nella struttura CMS.

C#

  public static X509Certificate2Collection EstraiCertificati(string percorso)

  {

      byte[] dati = File.ReadAllBytes(percorso);

 

      var signedCms = new SignedCms();

      signedCms.Decode(dati);    

 

       

      return signedCms.Certificates;

  }



La funzione legge il contenuto del file, lo decodifica mediante la classe SignedCms e restituisce la raccolta dei certificati presenti nella struttura della firma.

2. Recuperare il nome dal certificato
Per ricavare un nome da utilizzare nel nome del file, possiamo creare una funzione che recupera il nome semplice del certificato.

C#

 

private string RilevaNomeDalSubject(X509Certificate2 certificato)

 {

     return certificato.GetNameInfo(X509NameType.SimpleName, false);

 }


3. Selezionare e salvare il certificato estratto

Di seguito riportiamo il codice che consente di estrarre un certificato dal file P7M e di salvarlo sul computer in formato .cer.



C#

  private void BtnEstraiFileCertificato_Click(object sender, EventArgs e)

  {

      if (string.IsNullOrEmpty(TxtPercorsoNomeFileP7mPerCertificato.Text.Trim()))

      {

          Utility.MessaggioInfo("Selezionare un file firmato di tipo .p7m");

 

          return;

 

      }

 

           

 

      var certificati = EstraiCertificati(TxtPercorsoNomeFileP7mPerCertificato.Text.Trim());

 

      if (certificati.Count == 0)

      {

          MessageBox.Show("Nessun certificato trovato nel file.");

          return;

      }

 

      X509Certificate2 certificato = certificati[0];

            

      string valoreSubectNameCertificato = certificato?.SubjectName?.Name ?? "";

      if (valoreSubectNameCertificato =="")

      {

          valoreSubectNameCertificato = "Certificato";

      }

      using (SaveFileDialog saveFileDialog = new SaveFileDialog())

      {

          saveFileDialog.Filter = "Certificato DER (*.cer)|*.cer";

          saveFileDialog.Title = "Salva il certificato.";

 

          // Suggerisce un nome basato sul subject

          string NomeFile = RilevaNomeDalSubject(certificato);

          saveFileDialog.FileName = $"{NomeFile}.cer";

          saveFileDialog.DefaultExt = "cer";

          saveFileDialog.AddExtension = true;

 

          if (saveFileDialog.ShowDialog() == DialogResult.OK)

          {

              try

              {

                  string percorsoNomeFileDaSalvare = saveFileDialog.FileName;

                        

                  if (certificato != null)

                  {

                      byte[] certBytes = certificato.Export(X509ContentType.Cert);

                      File.WriteAllBytes(percorsoNomeFileDaSalvare, certBytes);

 

                  }

                           

 

 

 

                  MessageBox.Show($"Certificato salvato con successo:\n{percorsoNomeFileDaSalvare}",

                      "Successo", MessageBoxButtons.OK, MessageBoxIcon.Information);

              }

              catch (Exception ex)

              {

                  MessageBox.Show($"Errore nel salvataggio: {ex.Message}",

                      "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);

              }

          }

      }

 

 

  }



Nota: l'estrazione di un certificato da un file P7M non implica che la firma digitale sia valida o che il certificato sia attendibile. Il metodo EstraiCertificati restituisce i certificati inclusi nella struttura CMS, che non necessariamente comprendono l'intera catena di certificazione. Inoltre, il file .cer generato contiene il certificato pubblico, senza la relativa chiave privata.

sabato 17 ottobre 2026

C# Datagridview impostare il colore del testo di una colonna

Tramite la proprietà DefaultCellStyle di una colonna di un controllo DataGridView è possibile personalizzare l'aspetto delle celle, ad esempio impostando il colore del testo mediante la proprietà ForeColor.

Di seguito è riportato un esempio di utilizzo in C#:


C#

dataGridView1.Columns["Nome"].DefaultCellStyle.ForeColor = Color.Blue;

 

dataGridView1.DataSource = dati;



In questo esempio, il colore del testo delle celle della colonna denominata "Nome" viene impostato su blu.
Si noti che l'assegnazione della proprietà DataSource precede la modifica dello stile della colonna, in modo da consentire al controllo di generare le colonne qualora vengano create automaticamente a partire dalla sorgente dati.

giovedì 15 ottobre 2026

Download gioco Broadside Battle Arena

 

gioco gratuito spaziale

È disponibile su Epic Games Store Broadside Battle Arena, un videogioco di genere sparatutto spaziale, in lingua inglese.

Il gioco è scaricabile gratuitamente ed è disponibile per sistemi operativi Windows.

Per maggiori informazioni e per scaricare il videogioco, visitate la pagina ufficiale su Epic Games Store: https://store.epicgames.com/p/broadside-battlearena-a263af

mercoledì 14 ottobre 2026

Download gioco Atlantis Fantasy: Reborn

 

download gioco gratuito Atlantis Fantasy: Reborn

Atlantis Fantasy: Reborn è un videogioco d'avventura disponibile gratuitamente sulla piattaforma Epic Games Store. Il gioco è disponibile in lingua italiana ed è classificato PEGI 3, risultando adatto a un pubblico di tutte le età.

Il videogioco è compatibile con il sistema operativo Windows.

Per maggiori informazioni e per scaricare il gioco, visita la pagina ufficiale su Epic Games Store: https://store.epicgames.com/p/atlantis-fantasy-reborn-6834f9

martedì 13 ottobre 2026

C# ADO.NET: come verificare se i valori di una colonna di un DataTable sono univoci

In questo esempio, vediamo come utilizzare LINQ in ADO.NET per verificare se tutti i valori di una determinata colonna di tipo int di un oggetto DataTable sono univoci, ovvero se non sono presenti duplicati.

Di seguito è riportato un esempio di codice in C#:

C#

bool valoriUnivoci =dttDati.AsEnumerable().Select(r => r.Field<int>("Colonna"))

    .Distinct()

    .Count()

 == dttDati.AsEnumerable().Count();


Il codice estrae i valori della colonna "Colonna", elimina gli eventuali duplicati tramite il metodo Distinct() e confronta il numero di valori distinti con il numero totale di righe del DataTable.

Se i due conteggi coincidono, la variabile valoriUnivoci assume il valore true, indicando che tutti i valori della colonna sono univoci. In caso contrario, assume il valore false, indicando la presenza di duplicati.

Nota: l'esempio presuppone che la colonna esista, sia di tipo int e non contenga valori DBNull.