2013-02-13 14 views
6

In connessione con il mio progetto aziendale (intranet solo) mi sono imbattuto in una domanda con la verifica dei certificati utilizzando .net System.Security.Cryptography.X509Certificatescreare e verificare i certificati X509 in .Net

Fase 1: Creazione di un certificato di origine

Usa makecert per creare un certificato di origine e installarlo nelle autorità di certificazione fonti attendibili

makecert -r -pe -n "CN=Test Labs (CA)" -ss CA -sr CurrentUser -a sha256 -cy authority -sky signature -sv TestLabCA.pvk TestLabCA.cer 
pvk2pfx -pvk TestLabCA.pvk -spc TestLabCA.cer -pfx TestLabCA.pfx 

Fase 2: Creazione di un certificato e firmare con il certificato di origine

Usa makecert per creare un certificato, firmarlo con il certificato di origine e installarlo alle autori attendibili

makecert -pe -n "CN=Test Labs (SPC)" -a sha256 -cy end -sky signature -ic TestLabCA.cer -iv TestLabCA.pvk -sv TestLabSPC.pvk TestLabSPC.cer 
pvk2pfx -pvk TestLabSPC.pvk -spc TestLabSPC.cer -pfx TestLabSPC.pfx 

Passaggio 3: Verifica nel codice

Questo è l'esempio di codice C# per verificare i certificati:

X509Certificate2 rootCertificate = new X509Certificate2("TestLabCA.cer"); 
X509Certificate2 certificate = new X509Certificate2("TestLabSPC.cer"); 

// will return true 
Console.WriteLine("{0}, verified = {1}", rootCertificate.GetName(), rootCertificate.Verify()); 

// will return false 
Console.WriteLine("{0}, verified = {1}", certificate.GetName(), certificate.Verify()); 

// validate the chain 
var chain = new X509Chain(); 
chain.Build(certificate); 
Console.WriteLine("{0}, verified root of chain = {1}", certificate.GetName(), chain.ChainElements[chain.ChainElements.Count-1].Certificate.Verify()); 

Domanda:

Se voglio verificare il certificato, devo controllare la catena e verificare l'ultimo della catena, partendo dal presupposto che si tratta di un certificato di origine?

C'è un modo migliore per farlo?

risposta

2

Devi creare una catena di fiducia, sì. Ciò significa che devi risalire a un certificato di cui ti fidi. Questo non deve essere un certificato di origine, ma è normale affidarsi al certificato di origine e non a un certificato intermedio. A volte vuoi solo consentire una singola entità con un singolo certificato. Finché sei certo che sia il certificato corretto, puoi semplicemente fidarti del certificato a foglia singola, quindi la "catena" consisterebbe in un singolo certificato. Un esempio di questo sono i certificati di root autofirmati che vengono talvolta utilizzati dai servizi web.

Si noti che la verifica della catena di certificati è solo una parte della convalida totale di un certificato. È necessario assicurarsi che il certificato non sia stato revocato, che il certificato sia ancora valido (tra la data di validità e la data di scadenza). A volte esistono anche regole proprietarie aggiuntive per la convalida dei certificati, ad es. presenza dell'ID del certificato in un DB - whitelisting/blacklisting.

+0

Si noti che questo descrive i certificati X509 in un'infrastruttura PKI, che è leggermente diversa da un "web-of-trust" come utilizzato da ad es. PGP. –

2

Oltre alla risposta Maarten Bodewes':

Per verificare facilmente se la catena è valida è possibile utilizzare il seguente codice:

X509Certificate2 Certificate = new X509Certificate2("Certificate.pfx"); 
X509Chain CertificateChain = new X509Chain(); 
//If you do not provide revokation information, use the following line. 
CertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
bool IsCertificateChainValid = CertificateChain.Build(Certificate); 

IsCertificateChainValid quindi restituisce true quando la catena del certificato è corretto. In casi restituisce false è possibile utilizzare

CertificateChain.ChainStatus 

per informazioni su perché lo stato non è valido. I valori possibili includono NotTimeValid, UntrustedRoot.

Problemi correlati