Как проверить x509certificate2 против цепочки X509Certificate2Collection
я пишу синтаксический анализатор ответа SAML 2.0 для обработки аутентификации POST в ASP.Net (в C# и MVC, но это менее актуально).
Итак, у меня есть .p7b
файл для проверки, и это можно прочитать в X509Certificate2Collection
и пример утверждения-базовый 64-кодированный ответ SAML.
в идеале я хочу использовать встроенный в WSSecurityTokenSerializer
, а , не, поэтому я ищу способ, который работает.
я читаю XML напрямую вместо этого:
// get the base 64 encoded SAML
string samlAssertionRaw = GetFromHttpRequest();
// load a new XML document
var assertion = new XmlDocument { PreserveWhitespace = true };
assertion.LoadXml(samlAssertionRaw);
// use a namespace manager to avoid the worst of xpaths
var ns = new XmlNamespaceManager(assertion.NameTable);
ns.AddNamespace("samlp", @"urn:oasis:names:tc:SAML:2.0:protocol");
ns.AddNamespace("saml", @"urn:oasis:names:tc:SAML:2.0:assertion");
ns.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
// get the signature XML node
var signNode = assertion.SelectSingleNode(
"/samlp:Response/saml:Assertion/ds:Signature", ns);
// load the XML signature
var signedXml = new SignedXml(assertion.DocumentElement);
signedXml.LoadXml(signNode as XmlElement);
// get the certificate, basically:
// signedXml.KeyInfo.OfType<KeyInfoX509Data>().First().
// Certificates.OfType<X509Certificate2>().First()
// but with added checks
var certificate = GetFirstX509Certificate(signedXml);
// check the key and signature match
if (!signedXml.CheckSignature(certificate, true))
{
throw new SecurityException("Signature check failed.");
}
// go on and read the SAML attributes from the XML doc
этот лот работает, но все, что он делает, это проверяет, что подпись и X509Certificate2
открытый ключ в совпадении ответов SAML. Он никоим образом не проверяет, от кого он, и мне нужно сделать это, прежде чем принимать аутентификацию SAML.
кажется, есть два способа проверить сертификат, найденный в ответе SAML-я могу сделать certificate.Verify()
или я могу сделать проверку с подписью signedXml.CheckSignature(certificate, false)
.
однако оба возвращаются ложный.
я думаю, это потому, что они проверяются против машинного магазина или, возможно, в Интернете (я не уверен, как проверить). Я хочу проверить их на X509Certificate2Collection
полученные от .p7b
файл вместо этого-сертификаты, зарегистрированные на компьютере, следует игнорировать и просто .p7b
сертификаты проверены.
кажется, нет никакого способа пройти X509Certificate2Collection
или Verify
или CheckSignature
методы.
это право проверить, что делать с ответом SAML?
есть ли способ, чтобы использовать .p7b
сертификаты так, как я хочу?
1 ответов
вы пробовали использовать пользовательский X509Chain
настроено для поиска ExtraStore
сертификатов в процессе проверки. Что-то вроде следующего:
// Placeholder for the certificate to validate
var targetCertificate = new X509Certificate2();
// Placeholder for the extra collection of certificates to be used
var certificates = new X509Certificate2Collection();
var chain = new X509Chain();
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
chain.ChainPolicy.ExtraStore.AddRange(certificates);
bool isValidCertificate = chain.Build(targetCertificate);
в Примере проверка отзыва также отключена, но если у вас есть онлайн или автономный доступ к CRL, вы можете включить его.
на ExtraStore
должно позволять включать промежуточные сертификаты, которые не находятся в хранилище компьютера/пользователя. Однако доверенный корень сертификат может потребоваться в хранилище компьютера или пользователя в зависимости от указанного в X509Chain
потому что иначе вы получите UntrustedRoot
провал. Если даже корень не может быть доступен в машинном или пользовательском хранилище, вы можете попытаться пройти по результирующей цепочке и гарантировать, что единственная ошибка у вас есть из-за ненадежного корня и в то же время гарантировать, что корень цепи-это то, что вы ожидаете на основе X509Certificate2Collection
у вас есть для проверки.
альтернативно вы могли бы создайте свой собственный X509CertificateValidator
для проверки сертификата, принимая во внимание только при условии X509Certificate2Collection
.