【问题标题】:How to decode encrypted SAML response from idP with PHP?如何使用 PHP 解码来自 idP 的加密 SAML 响应?
【发布时间】:2013-08-20 16:44:58
【问题描述】:

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

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

我已经配置了我的元数据并通过 SimpleSAMLphp 中的身份验证接口对其进行了测试。 idP 有一个与我们开始的地方不同的回发 URL 集,所以:

  • 用户点击 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() 时,它是一个空数组。我们使用的是phpsessionstore.type,但是当我查看域上的cookie时,我只看到PHPSESSIDSimpleSAMLAuthToken

所以我们尝试将所有这些都放在一种方法中。如上所述,只有您从 domain.com/sso/saml 开始,但这次循环不断重复。用户访问我们的域,被重定向到 idP,然后被重定向回我们,然后永远返回到 idP。

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

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

  • samlp:Response->saml:EncryptedAssertion->EncryptedData->KeyInfo->EncryptedKey->X509Data->X509Certificate
  • samlp:Response->saml:EncryptedAssertion->EncryptedData->KeyInfo->EncryptedKey->CipherData->CipherValue
  • samlp:Response->saml:EncryptedAssertion->EncryptedData->CipherData->CipherValue

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

  • samlp:Response->saml:EncryptedAssertion->EncryptedData->KeyInfo->EncryptedKey->EncryptionMethod 建议RSA1_5
  • samlp:Response->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,但如果不是,我会就如何解密文件提供一些指导。

谢谢大家

【问题讨论】:

    标签: php single-sign-on saml


    【解决方案1】:

    请检查One Login SAML php 库,它有很好的文档和编码。您可以轻松地使用它来处理响应和 getAttributes 做您想做的事情。

    我知道这个问题很老,但它可能会帮助仍在寻找相同问题的人。

    【讨论】:

    • 我们尝试了 One Login,结果发现它不支持我们需要的东西......我不记得它是什么,因为它几乎是两年前的事了,但它没有t工作......希望我能记住它是什么。可能当时缺少对加密有效负载的支持?我们确实让 SimpleSAMLphp 工作了,但我希望在不需要比我们整个应用程序更大的库的情况下管理这一切
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2021-10-16
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多