Как проверить X509Certificate2 по цепочке X509Certificate2Collection

Я пишу синтаксический анализатор ответов SAML 2.0 для обработки аутентификации POST в ASP.Net (в C # и MVC, но это менее актуально

Итак, у меня есть . p7b для проверки, который может быть прочитан в X509Certificate2Collection и образец утверждения - ответ SAML в кодировке base 64.

В идеале я хочу использовать встроенный 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().First().
//     Certificates.OfType().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 - я могу сделать сертификат .Verify () или я могу выполнить проверку с помощью подписи signedXml. CheckSignature (certificate, false) .

Однако оба возвращают false.

Я думаю, это потому, что они проверяются в машинном магазине или, возможно, в сети (я не уверен, как это проверить). Вместо этого я хочу сравнить их с X509Certificate2Collection , полученным из файла .p7b - сертификаты, зарегистрированные на машине, должны игнорироваться и проверяться только сертификаты .p7b .

Кажется, нет никакого способа передать X509Certificate2Collection методам Verify или CheckSignature .

Правильно ли это. проверьте ответ SAML?

Есть ли способ использовать сертификаты .p7b так, как я хочу?

10
задан Community 23 May 2017 в 11:43
поделиться