【问题标题】:Does Saml2SecurityTokenHandler support SAML2 assertions signed using SHA256?Saml2SecurityTokenHandler 是否支持使用 SHA256 签名的 SAML2 断言?
【发布时间】:2017-06-20 14:36:47
【问题描述】:

TL;DR:任何人都可以找到在验证期间Saml2SecurityTokenHandler 支持哪些签名算法的权威机构?


我正在使用Saml2SecurityTokenHandler 来验证来自我的 IdP 的 SAML 断言。

作为参考,我使用了一个用 SHA256 签名的示例断言 here

<Assertion ID="_de9f29bd-52ca-4237-95c1-eb53f70fe8e5" IssueInstant="2012-11-06T00:45:30.593Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
<Issuer>ADatum</Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
        <ds:Reference URI="#_de9f29bd-52ca-4237-95c1-eb53f70fe8e5">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
            <ds:DigestValue>+6OWUn1dFIUJQ6FQ25zgmZvg8zPzfcjnj4ujUvgfmEQ=</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>O85ytS9fcAhOk/0K25SndyBUbNLrx6J+tv+Uht+HZZ4CzsqjVBU1FpkXjDG03HqZ7xEu3+rMnsyxefDq6Xftw1E926QsG/oPM/afWfbR5dLucjsVaNzXCXzZu+jBmp5KkAv/vv1Es67KnPMr/RDeCVFy9eyxJka6dd8h8RTlatg=</ds:SignatureValue>
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <X509Data>
            <X509Certificate>MIICGjCCAYOgAwIBAgIQeJe5qR+4T6VJNZYtWjhErzANBgkqhkiG9w0BAQQFADAgMR4wHAYDVQQDExVBQ1MyQ2xpZW50Q2VydGlmaWNhdGUwHhcNMTExMDEwMDcwMDAwWhcNNDExMjMxMDcwMDAwWjAgMR4wHAYDVQQDExVBQ1MyQ2xpZW50Q2VydGlmaWNhdGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKjtrnJ+bduREosQ9+SH1ocI13wlxStLi8y5heGPo5UBcuf0hYRq4PvjwEY2twebP6iwxjwGqhu224UDUfPWMhQBOh+NFnv9GHAh+W4jFJxvTCcyXTkZRFqgAYRjMvyxzNeHVqn4AJ/ddKGf1fMVCuKhPYteHy2yNacXujucPP6/AgMBAAGjVTBTMFEGA1UdAQRKMEiAEFD3/7uhGcI2nSHZqB0bN66hIjAgMR4wHAYDVQQDExVBQ1MyQ2xpZW50Q2VydGlmaWNhdGWCEHiXuakfuE+lSTWWLVo4RK8wDQYJKoZIhvcNAQEEBQADgYEAkgxktVU5e8TVoigsDRm4qyw6gM/kie3e6dFM0T1BFoQV0PW9W9yKPiP72eTi+331tLFnwDxz5RJLABctAO71plwtREd0k3E0Jsju+Web+u8YcCD43aViQXgXRrY5ghDGwpFRcaNa1PnYY5nk3DYfyZZdz1L+fb30VDiugdf7dBI=</X509Certificate>
        </X509Data>
    </KeyInfo>
</ds:Signature>
<Subject>
    <NameID>ADatum</NameID>
    <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" />
</Subject>
<Conditions NotBefore="2012-11-06T00:45:31.905Z" NotOnOrAfter="9999-12-31T23:59:59.999Z">
    <AudienceRestriction>
        <Audience>https://accesscontrol.adatum.com</Audience>
    </AudienceRestriction>
</Conditions>
<AttributeStatement>
    <Attribute Name="http://schemas.microsoft.com/spf/2012/03/claims/tenantname">
        <AttributeValue>Fabrikam</AttributeValue>
    </Attribute>
</AttributeStatement>
<AttributeStatement>
    <Attribute Name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role">
        <AttributeValue>SSU</AttributeValue>
    </Attribute>
</AttributeStatement>
<AttributeStatement>
    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn">
        <AttributeValue>accesscontrol@adaum.com</AttributeValue>
    </Attribute>
</AttributeStatement>

我有以下代码试图验证此签名

//All that matters now is to validate the token and get the claims
var validationParameters = new TokenValidationParameters();
validationParameters.ValidIssuer = options.Issuer;
validationParameters.ValidAudience = options.Audience;
validationParameters.IssuerSigningToken = new X509SecurityToken(options.SigningCertificate);
validationParameters.ValidateLifetime = validateLifetime;
validationParameters.TokenReplayCache = options.ReplayRepository;

EnsureCanonicalForm(response, assertion);

SecurityTokenHandlerCollection coll = SecurityTokenHandlerCollectionExtensions.GetDefaultHandlers();
SecurityToken tokenOut;
var retVal = coll.ValidateToken(assertion.OuterXml, validationParameters, out tokenOut);

options.SigningCertificate 是您可以在 XML 中看到的以MII... 开头的证书。 assertion.OuterXml是上面XML的全部内容。

我期待 SAML2SecurityTokenHandler 处理 SHA256,但此代码在 ValidateToken() 上失败并出现错误

签名验证失败。

我知道代码适用于 SHA1,使用相同的代码和不同的断言示例。

我在the handlerthe token itself 周围的文档中找不到任何提及签名算法的内容,但至少one of the specs 用于XML 签名散列确实调用了SHA256。

谁能找到这个类支持哪些签名算法的权威来源?

【问题讨论】:

  • 我能回忆起使用 SAML 2 测试 sha256
  • 我可以确认 SHA256 在 SAML2 断言中不是问题。我们已经在使用 IdentityServer v2 作为 STS 的几个项目中实现了它。

标签: c# certificate saml-2.0


【解决方案1】:

Saml2SecurityTokenHandler 在验证签名时无法正确处理空格。在大多数情况下,这并不重要,因为断言很少被打印出来。但是这个是。所以我想这就是问题所在。

对于我创建的 SAML 库,我们完全跳过了处理程序中的签名验证,而是根据 SignedXml 自己进行验证,这样更可靠(尽管您需要记住自己检查引用)。

【讨论】:

  • Pretty print 将使几乎所有已签名的 xml 的签名无效,因为它会破坏原始文档(原始文档已经被漂亮打印时除外)。您无法分辨文档的外观,因为规范化方案没有考虑空格。恕我直言,无法计算已签名文档的正确哈希值,因此无法验证文档的完整性/签名。
  • 漂亮的打印计算签名后使其无效。但是Saml2SecurityTokenHandler 会出现问题,如果包含空格(例如漂亮的打印)的 XML 文档被签名。
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多