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();
}