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.
fonte
2011-09-07 10:15:37
Come posso verificare 3 in una volta? come posso incatenare i 3 certs? – Jacob
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