Con il post [Security 21] entriamo nella zona Certificati Digitali.

Come si vedrà più avanti, la classe X509Certificate non crea certificati, ma si limita unicamente ad analizzarli. Tuttavia, per avere un certificato su cui lavorare non è per forza necessario avere una CA (Certification Authority). NET viene distribuito con il Certificate Creation tool (makecert.exe).

Creiamo quindi il nostro certificato su cui andremo a lavorare più avanti

makecert "c:\IMieiCertificatiSonBelli\UgiCert.cer"

Prestate attenzione al fatto che makecert dispone di una considerevole quantità di opzioni di esecuzione disponibili. Possiamo creare i certificati con quasi tutte le informazioni che vogliamo. Per esempio è possibile specificare il Subject Name con il l'opzione di esecuzione -n come di seguito riportato.

makecert -n "CN=UGI" UgiCert.cer

Oppure possiamo specificare la data in cui il nostro certificato non sarà più valido (-e)

makecert -e 03/09/2010 UgiCert.cer

Attenzione : Questo tool è nato per permettere a tutti noi di prendere confidenza con la classe X509Certificate e non per mandare rilasciare certificati in ambienti di Produzione.
Considerateli sempre e solo certificati di collaudo.

Classe X509Certificate

Questa classe ha due metodi statici che permettono di visualizzare tutte le informazioni che un certificato può contenere. Queste classi sono : CreateFromCertiFile() e CreateFromSignedFile(). Questi nomi, non proprio corretti sotto un profilo logico, di fatto non creano alcun certificato.. ma creano un oggetto X509Certificate che contiene le informazioni del certificato da cui viene generato. Per capire meglio.. immaginate un file certificato come un oggetto impossibilitato ad accedere al mondo .NET, l'unica cosa che può fare è passare le sue informazioni ad un oggetto d'intermezzo.. e da qui X509Certificate.

Una volta istanziato l'oggetto X509 è possibile lavorare con tutta una serie di metodi read-only come :

GetIssuerName()
GetEffettiveDateString()

oppure

GetCertHash()
GetPublicKey() [ come dimostra l'esempio ]

String adPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
X509Certificate x509 = X509Certificate.CreateFromCertFile(
    adPath + @"\UGI.cer");
String x509Name = x509.GetName();
byte[] x509PublicKey = x509.GetPublicKey();

Oltre a questo non ci sono altre grandi cose da fare con i certificati, forse l'unica cosa che resta è la possibilitàdi creare un oggetto X509 a partire da un altro X509 preesistente.

String adPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
X509Certificate x509 = X509Certificate.CreateFromCertFile(
    adPath + @"\UGI.cer");
X509Certificate x509Derived = 
new X509Certificate(x509.GetRawCertData());
X509CertificateCollection x509Col = 
new X509CertificateCollection();
x509Col.Add(x509);
x509Col.Add(x509Derived);
foreach(X509Certificate cert in x509Col)
{
   String issuerName = cert.GetIssuerName();
}