1

我有一个正在尝试与 Federated Security 集成的应用程序——特别是 Siteminder。我正在使用此处找到的 PHP-SAML 工具包:https ://github.com/onelogin/php-saml

我在应用程序中包含 x509 证书,一切正常,直到在 Siteminder 环境中打开加密。一旦打开,我就无法再登录——我收到了这条消息:无效的 SAML 响应:找不到签名节点

我已经能够确定从 Siteminder 发送到应用程序的 SAML 断言是加密的。我可以看到断言(示例如下)。不幸的是,我不知道如何解密该消息,以便我可以在我的应用程序中解析和使用。

<Response xmlns="urn:oasis:names:tc:SAML:2.0:protocol"
      Destination="{VALUE HERE}"
      ID="_076e8f69ec4adb3b72f0cc76570527222e37"
      IssueInstant="2013-01-15T18:18:48Z"
      Version="2.0"
      >
<ns1:Issuer xmlns:ns1="urn:oasis:names:tc:SAML:2.0:assertion"
            Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
            >{VALUE HERE}</ns1:Issuer>
<Status>
    <StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
</Status>
<ns2:EncryptedAssertion xmlns:ns2="urn:oasis:names:tc:SAML:2.0:assertion">
    <xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
                        Type="http://www.w3.org/2001/04/xmlenc#Element"
                        >
        <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
                <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
                <xenc:CipherData>
                    <xenc:CipherValue>{VALUE HERE}</xenc:CipherValue>
                </xenc:CipherData>
            </xenc:EncryptedKey>
            <ds:X509Data>
                <ds:X509Certificate>
{CERTIFICATE HERE}
</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
        <xenc:CipherData>
            <xenc:CipherValue>{VALUE HERE}</xenc:CipherValue>
        </xenc:CipherData>
    </xenc:EncryptedData>
</ns2:EncryptedAssertion>
</Response>

如果有人可以提供帮助,那就太棒了。

4

3 回答 3

1

要解密 SAML 消息,您可以提取simplesamlphp库的一些代码。

lib/SAML2/Utils.php的函数_decryptElement解密消息元素:

函数头:

function _decryptElement(DOMElement $encryptedData, XMLSecurityKey $inputKey, array &$blacklist)

(对 $blacklist 使用空数组)

检查:

http://code.google.com/p/simplesamlphp/source/browse/trunk/lib/SAML2/Utils.php#356

要构建 DOMElement,您可以使用lib/SimpleSAML/Utilities.php的以下功能:

formatXMLStringformatDOMElement

http://code.google.com/p/simplesamlphp/source/browse/trunk/lib/SimpleSAML/Utilities.php#1577

于 2013-01-23T11:56:55.387 回答
1

我建议使用lightsaml/lightsaml库。在它的食谱中有一个关于解密 SAML 断言的条目http://www.lightsaml.com/LightSAML-Core/Cookbook/How-to-decrypt-Assertion/

它是通过将 XML 反序列化为 Response 数据模型对象、加载您的密钥对凭证并在返回纯 Assertion 的 EncryptedAssertion 上调用解密方法来完成的。

于 2015-12-15T07:27:46.773 回答
0

我怀疑这是 Onelogin PHP 代码的问题 - 已记录了一个类似的问题,并且 Ruby 实现也有一个相同的问题。

更新:

如果您试图解决这个问题,您需要使用您的证书解密它,即您发送到 IP 的 sp.xml 元数据中的那个。

从未使用过 Onlelogin,但SimpleSAMLphp代码中会有示例。

于 2013-01-16T01:51:52.063 回答