我正在編寫一個SAML 2.0響應解析器來處理ASP.Net中的POST驗證(在C#和MVC中,但這不太相關)。如何根據X509Certificate2Collection鏈驗證X509Certificate2
所以我有一個.p7b
文件來驗證,並可以讀取到一個X509Certificate2Collection
和一個示例斷言 - 一個基地64編碼的SAML響應。
理想情況下,我想使用內置的WSSecurityTokenSerializer
,但that fails,所以我正在尋找一種可行的方式。
我讀取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
也就是說很多作品,但所有它做的是檢查簽名和SAML響應匹配X509Certificate2
公鑰。它不以任何方式驗證它來自哪裏,我需要在接受SAML身份驗證之前執行此操作。
似乎有兩種方法可以檢查在SAML響應中找到的證書 - 我可以做certificate.Verify()
或者我可以使用簽名signedXml.CheckSignature(certificate, false)
進行檢查。
然而,兩者都返回false。
我認爲這是因爲他們正在對機器商店或可能在線檢查(我不知道如何檢查)。我想檢查它們與從.p7b
文件檢索到的X509Certificate2Collection
,而不是 - 在機器上註冊的證書應該被忽略,並且只檢查.p7b
證書。
似乎沒有辦法將X509Certificate2Collection
傳遞給Verify
或CheckSignature
方法。
這是對SAML響應的正確檢查嗎?
有什麼辦法可以按照我想要的方式使用.p7b
證書嗎?
GetFirstX509Certificate是做什麼的? – theycallmemorty 2011-05-25 20:41:36
我在這裏問了一個類似的問題:http://security.stackexchange.com/questions/3905/verify-saml-response-is-from-a-trusted-source但最終結束在您的文章,因爲我有與CheckSignature相同的問題 – theycallmemorty 2011-05-25 20:43:46
@theycallmemorty - 我嘗試在註釋中解釋,但它使用X509Certificate2'簽名'signedXml.KeyInfo [0] .Certificates [0],但使用檢查和強制轉換。 – Keith 2011-05-25 22:34:08