5

我们在服务提供商站点上使用 OpenSAML 为我们的客户提供 SSO。我们的客户(ID 提供者)最终使用 OpenSSO。当涉及到签名元素时,OpenSSO 发布的 SAML 响应略有不同,因为它不受命名空间的限制。这似乎不适用于 OpenSAML,它从该 samlResponse.getSignature()方法返回 null,因此我无法验证签名。

导致问题的 SamlReponse 的签名片段

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <Reference URI="#s2d10cccbd58d1f78c2c76c74c82a236548c929ffd">
            <Transforms>
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>j+KBoDOtEcyCquPTxRCXoBulStQ=</DigestValue>
        </Reference>
    </SignedInfo>
    <SignatureValue>Dv+owuZfGFymGGrw2gHA3/7GVC6mXt8JMW+tOvmtnjTRJZaDE+Nb2NCngio1Tnqu4LWnvVrry4Wk... 6QcIJi/kGc4YFMSQj/Q=</SignatureValue>
    <KeyInfo>
        <X509Data>
            <X509Certificate>MIIEhDCCA+2gAwIBAgIQXxhipi2wpPxWi7MTVfFVHDANBgkqhkiG9w0BAQUFADCBujEfMB0GA1UE... 78Q/lRQuBhHMy02lKctnwjBeEYA=</X509Certificate>
        </X509Data>
    </KeyInfo>
</Signature>

来自另一个有效的 SAML 响应的签名片段

<dsig:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo>
        <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <dsig:Reference URI="#id-TtLltjcBSOAJ6OipumUEj8o0Qag-">
            <dsig:Transforms>
                <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <dsig:DigestValue>5c95zhA139qzMvZA2A445F3LWaU=</dsig:DigestValue>
        </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>JsmRFJn1CjClHs4rf0hrwKzOq6ZtmnOEm/PNiaJvYurko/ZP+PApWhk55x0unIVwZ6XDv3k8Dj81WqUl07J0Dkvzp71bccIgiGTRzoNPT71nBAXxJmZiXz51JWctg13zjxP0oQMSpWytKCrFkCkJ0So3RQl3WixYV3miK0YjJnM=</dsig:SignatureValue>
    <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    </ds:KeyInfo>
</dsig:Signature>

正如您在上面看到的,来自 OpenSSO 服务器的签名片段不包含 SAML 绑定规范中指定的命名空间限定符。

对我来说,最后一个选项是对发布的 SAMLResponse 进行一些按摩,以将命名空间添加到签名元素以使 OpenSAML 库正常工作。

任何关于如何使用 OpenSAML 库来解决这个问题的想法都非常感谢。

在此先感谢 CJ

4

2 回答 2

0

我们正在使用ComponentSpace SAML 2.0 库,并遇到了一个使用 ADFS 作为其身份提供者的客户的类似问题。他们的 ADFS 服务器生成的 XML 元素没有像您的第一个示例那样单独限定,我最初认为这是问题所在。

原来它是有效的 XML,不是问题。在我们的例子中,ComponentSpace 库有不同的方法来处理签名断言和非签名断言。一旦我们切换到检查签名断言,它就起作用了。

OpenSAML 库应该能够处理非限定 XML 元素。您可能希望将其作为问题报告给库维护者。

于 2012-06-21T15:36:14.323 回答
0

您也许可以进行一些 DOM 操作来修复 XML。例如,我必须编写一些代码来修复来自客户端的 SAML 响应 XML 中的一些命名空间属性(实际上,命名空间是在 Response 元素中定义的,但需要提取断言并需要保留命名空间)。

Element assertionElem = assertion.getDOM();

if (!assertionElem.hasAttribute("xmlns:saml")) {
   assertionElem.setAttribute("xmlns:saml", "urn:oasis:names:tc:SAML:2.0:assertion");
}

if (!assertionElem.hasAttribute("xmlns:ds")) {
   assertionElem.setAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#");
}

String assertionXml = Serializer.serializeXml(assertionElem, true, true);

您可以将 xmlns="http://www.w3.org/2000/09/xmldsig#" 属性添加到 Signature,然后setDOM()进行更新。问题是,是否samlResponse.getSignature().getDOM()会为您获取 XML,或者您是否必须为整个响应获取 DOM 并从中提取 Signature 元素。

当然,实际上,客户端不应该向您发送命名空间不正确的 XML,但我们知道这是怎么回事。

于 2010-11-05T20:26:55.673 回答