giovedì 22 ottobre 2026

C# .NET 10 – Come verificare la validità del certificato di firma digitale di un file .p7m

In questo esempio vedremo come, in un progetto .NET 10 sviluppato in C#, sia possibile verificare la validità di un certificato digitale.
L'esempio utilizza esclusivamente le classi messe a disposizione dal framework .NET, senza ricorrere a librerie esterne.
Di seguito vedremo come verificare le date di validità del certificato, controllare la catena di certificazione e verificare l'eventuale revoca.


C#

private void VerificatoStatoCertificato(X509Certificate2 certificate)

 {

     // --- CONTROLLO  SCADENZA in maniera Semplice ---

     DateTime oggi = DateTime.Now;

     if (oggi < certificate.NotBefore)

     {

         MessageBox.Show($"Il certificato non è ancora valido.\nInizio validità: {certificate.NotBefore}",

             "Certificato Non Valido", MessageBoxButtons.OK, MessageBoxIcon.Warning);

         return;

     }

     if (oggi > certificate.NotAfter)

     {

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

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

         return;

     }

 

     // --- CONTROLLO REVOCA E CATENA scenario Avanzato  ---

     using (X509Chain chain = new X509Chain())

     {

         // Configurazione della politica di validazione

         chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; // Forza controllo revoca online (CRL/OCSP)

         chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; // Non controlla la revoca della Root CA

         chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

 

         // Build() esegue la verifica effettiva

         bool isValidChain = chain.Build(certificate);

 

         if (isValidChain)

         {

             MessageBox.Show("Il certificato è VALIDO, non è scaduto e non risulta revocato.",

                 "Verifica Completata", MessageBoxButtons.OK, MessageBoxIcon.Information);

         }

         else

         {

             // Se isValidChain è false, analizziamo i motivi specifici (es. Revocazione)

             string erroriTrovati = "";

             foreach (X509ChainStatus status in chain.ChainStatus)

             {

                 // Filtriamo per trovare specificamente la revoca

                 if (status.Status == X509ChainStatusFlags.Revoked)

                 {

                     erroriTrovati += " IL CERTIFICATO È STATO REVOCATO!\n";

                 }

                 else

                 {

                     erroriTrovati += $"  {status.Status}: {status.StatusInformation}\n";

                 }

             }

 

             MessageBox.Show($"Il certificato non è valido:\n\n{erroriTrovati}",

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

         }

     }

 }

 



Di seguito l'esempio di codice per invocare la funzione appena descritta.


C#

private void BtnVerifica_Click(object sender, EventArgs e)

{

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

    {

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

 

        return;

 

    }

 

    X509Certificate2 certificate = new X509Certificate2(TxtPercorsoFileP7mVerifica.Text.Trim());

 

    //Invoca la funzione

    VerificatoStatoCertificato(certificate);

}




Nessun commento: