public static X509Certificate2Collection EstraiCertificati(string percorso)
{
byte[] dati = File.ReadAllBytes(percorso);
var signedCms =
new SignedCms();
signedCms.Decode(dati);
return signedCms.Certificates;
}
private string RilevaNomeDalSubject(X509Certificate2 certificato)
{
return certificato.GetNameInfo(X509NameType.SimpleName,
false);
}
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);
}
}
}
}

