如何使用PHP解码来自idP的加密SAML响应?

时间:2013-08-20 16:44:58

标签: php single-sign-on saml

首次尝试将SAML实施为SP。我们决定尝试将SimpleSAMLphp与我们的定制MVC框架一起使用,因为我们认为它可以节省我们的时间。

我遇到的问题是我最终陷入无限循环或属性为空。

我已经配置了我的元数据,并在SimpleSAMLphp中通过身份验证界面对其进行了测试。 idP的回发网址设置与我们开始的地址不同,因此:

  • 用户点击domain.com/sso我们创建了SimpleSAML_Auth_Simple('our-configured-sp')
  • 的新实例
  • 致电$as->requireAuth()
  • 客户端被重定向到idP
  • idP将用户重定向回domain.com/sso/saml

如果我们这样做,我们必须使用相同的代码(例如$as = new SimpleSAML_Auth_Simple('our-configured-sp'))创建一个新实例,当我们执行$as->getAttributes()时,它是一个空数组。我们正在使用phpsession store.type,但当我查看域中的Cookie时,我只看到PHPSESSIDSimpleSAMLAuthToken

所以我们尝试将它们全部放入一个方法中。如上所述,只有你从domain.com/sso/saml开始,除非这次循环不断重复。用户点击我们的域名,被重定向到idP,然后重定向回我们,然后回到idP,永远。

最终我放弃了。我可以在$_POST['SAMLResponse']中获得回复,我可以base64_decode()查看它的内容。我将它放入SimpleXMLElement对象中,并能够使用它。问题是数据是加密的,现在我一直试图解密它。

我在这些节点中有数据,但不知道如何处理它:

  • samlp:响应 - > SAML:EncryptedAssertion-> EncryptedData-> KeyInfo-> EncryptedKey-> X509Data-> x509证书
  • samlp:响应 - > SAML:EncryptedAssertion-> EncryptedData-> KeyInfo-> EncryptedKey-> CipherData->的CipherValue
  • samlp:响应 - > SAML:EncryptedAssertion-> EncryptedData-> CipherData->的CipherValue

我不知道如何使用其中的每一个,但我可以验证X509Certificate是与我的私钥匹配的公钥。我尝试使用不同的键(或者我认为是键)解码各种值无济于事。

  • samlp:响应 - > saml:EncryptedAssertion-> EncryptedData-> KeyInfo-> EncryptedKey-> EncryptionMethod建议RSA1_5
  • samlp:响应 - > saml:EncryptedAssertion-> EncryptedData-> EncryptionMethod建议AES256-CBC(我一直在尝试mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, "cbc", $iv);虽然我实际上无法弄清楚我应该做什么放入$key$data

理想情况下,我想让它完全在SimpleSAMLphp中运行,但老实说我不知道​​问题是什么,所以我不知道如何对它进行排序。元数据如下所示:

$metadata = array(
    'https://partner.com' => array(
        'SingleSignOnService' => 'https://partner.com/sso/response',
        'SingleLogoutService' => 'https://partner.com/sso/slo',
        'assertion.encryption' => true,
        'certificate' => partner.cer'
    )
);

Authsources有这个:

$config = array(
    'our-configured-sp' => array(
        'saml:SP',
        'privatekey' => 'my.private.pem',
        'certificate' => 'my.public.cert',
        'idp' => 'https://partner.com',
        'baseurlpath' => 'simplesaml/',
    )
);

有任何帮助吗?最好让整个事情与SimpleSAMLphp一起使用,但如果没有,我会就如何解密文件采取一些指导。

谢谢大家

1 个答案:

答案 0 :(得分:0)

请检查One Login SAML php库,它有详细记录和编码。您可以轻松地使用它来处理响应,并且getAttributes可以执行您想要的操作。

我知道这个问题已经过时了,但它可能有助于某些人继续寻找相同的问题。