OpenSAML如何检查SAML响应(签名/证书)是否真的来自我的IDP?

时间:2016-11-03 09:18:54

标签: java azure authentication saml-2.0 opensaml

您好我将此XML作为我的IDP的SAML2响应:

  <Assertion ID="_97031c65-0139-4047-a416-9495df5d6ed7"
    IssueInstant="2016-10-26T07:45:43.438Z" Version="2.0"
    xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
    <Issuer>
    </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="#_97031c65-0139-4047-a416-9495df5d6ed7">
                <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>
                  KMaF...
                </ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
          FHdZ....
        </ds:SignatureValue>
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <X509Data>
                <X509Certificate>
                  MII....
                </X509Certificate>
            </X509Data>
        </KeyInfo>
    </ds:Signature>
    ....

现在我想检查一下来自我的IDP的响应是否是有效的响应。如何才能做到这一点? (我正在使用OpenSAML 3.x java) 仅仅对签名和证书进行字符串比较是否足够?

我还有一个MetadataDocument.XML,其中包含我的IDP(Azure)的凭据信息。

相关:
SAML 2.0 - How to verify the sender certificate?

OpenSAML (2.0) Signature validation not working

1 个答案:

答案 0 :(得分:2)

首先要做的事情:

不要推广自己的SAML实施。有太多东西你可以弄错,不值得冒这个风险。我不知道我是否可以强调这一点。使用开源,众所周知且经过测试的实施,例如Shibboleth SPsimplesamlphp

除了上面的警告,并假设您是为了您自己的理解而这样做,而不是作为产品/服务的一部分,除了您之外的任何人都可以使用:

检查响应来自您的IDP的方法是检查数字签名。为此,您必须使用IDP的公钥(包含在您从IDP元数据中知道的IDP证书中)以验证数字签名。请阅读Digital SignaturesDigital Signature verification,了解需要完成的工作和原因。然后,您可以通过阅读Official Documetnation继续了解如何操作。一些说明:

  • 不信任 SAML断言附带的证书。这就是您知道给定依赖方的多个证书的情况,您需要选择适用于特定SAML会话的证书。
  • 您无法在签名上进行字符串比较。您无法计算相同的签名,因为您没有IdP用于创建私钥的私钥。