2011-09-07 35 views
13

Diciamo che ho tre certificati (in formato Base64)C# Come posso convalidare una catena di certificati Root-CA-Cert (x509)?

Root 
| 
--- CA 
    | 
    --- Cert (client/signing/whatever) 

Come posso validare i CERT e certificato di percorso/catena in C#? (Tutti quei tre certs potrebbero non essere nel mio computer negozio cert)

Edit: BouncyCastle ha la funzione di verificare. Ma sto cercando di non usare alcuna libreria di terze parti.

byte[] b1 = Convert.FromBase64String(x509Str1); 
    byte[] b2 = Convert.FromBase64String(x509Str2); 
    X509Certificate cer1 = 
     new X509CertificateParser().ReadCertificate(b1); 
    X509Certificate cer2 = 
     new X509CertificateParser().ReadCertificate(b2); 
    cer1.Verify(cer2.GetPublicKey()); 

Se il CER1 non è firmato da cert2 (CA o root), ci saranno eccezioni. Questo è esattamente quello che voglio.

risposta

0

Dai uno sguardo allo 'X509Certificate2.Verify()'. Dovrebbe aiutare

+0

Come posso verificare 3 in una volta? come posso incatenare i 3 certs? – Jacob

+0

Non sono sicuro, ma provare a creare un archivio temporaneo [X509Store] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx). Di aggiungere tutti i certificati in quel negozio. Dopo questo, è necessario chiamare la convalida sul certificato più basso. – MichaelMocko

20

La classe X509Chain è stata progettata per eseguire questa operazione, è anche possibile personalizzare il modo in cui esegue il processo di costruzione della catena.

static bool VerifyCertificate(byte[] primaryCertificate, IEnumerable<byte[]> additionalCertificates) 
{ 
    var chain = new X509Chain(); 
    foreach (var cert in additionalCertificates.Select(x => new X509Certificate2(x))) 
    { 
     chain.ChainPolicy.ExtraStore.Add(cert); 
    } 

    // You can alter how the chain is built/validated. 
    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage; 

    // Do the validation. 
    var primaryCert = new X509Certificate2(primaryCertificate); 
    return chain.Build(primaryCert); 
} 

Il X509Chain conterrà ulteriori informazioni sulla mancata convalida dopo Build() == false se ne avete bisogno.

Modifica: Ciò si limita a garantire che le CA siano valide. Se si desidera assicurarsi che la catena sia identica, è possibile controllare manualmente le impronte digitali. È possibile utilizzare il seguente metodo per garantire che la catena di certificazione è corretta, si aspetta la catena nell'ordine: ..., INTERMEDIATE2, INTERMEDIATE1 (Signer of INTERMEDIATE2), CA (Signer of INTERMEDIATE1)

static bool VerifyCertificate(byte[] primaryCertificate, IEnumerable<byte[]> additionalCertificates) 
{ 
    var chain = new X509Chain(); 
    foreach (var cert in additionalCertificates.Select(x => new X509Certificate2(x))) 
    { 
     chain.ChainPolicy.ExtraStore.Add(cert); 
    } 

    // You can alter how the chain is built/validated. 
    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage; 

    // Do the preliminary validation. 
    var primaryCert = new X509Certificate2(primaryCertificate); 
    if (!chain.Build(primaryCert)) 
     return false; 

    // Make sure we have the same number of elements. 
    if (chain.ChainElements.Count != chain.ChainPolicy.ExtraStore.Count + 1) 
     return false; 

    // Make sure all the thumbprints of the CAs match up. 
    // The first one should be 'primaryCert', leading up to the root CA. 
    for (var i = 1; i < chain.ChainElements.Count; i++) 
    { 
     if (chain.ChainElements[i].Certificate.Thumbprint != chain.ChainPolicy.ExtraStore[i - 1].Thumbprint) 
      return false; 
    } 

    return true; 
} 

non sono in grado di testare questo perché non ho una catena completa di CA con me , quindi sarebbe meglio eseguire il debug e scorrere il codice.

+0

Grazie. Ma ho intenzionalmente messo un cert emittente diverso in "certificati aggiuntivi" e il risultato è "vero" :( – Jacob

+0

@Jacob, prova il nuovo metodo –

+0

Grazie Jonathan, ma non funziona. Sembra catena.Controlla la validità dei certificati Non è il percorso di certificazione, purché i certificati siano validi (anche se la catena di certificati/percorso è errata) il risultato è vero. Il metodo di identificazione personale non funziona perché tutti i thumbprint sono diversi (anche nel percorso/catena corretto) – Jacob

Problemi correlati