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

如何用PHP解码来自idP的加密SAML响应?,php,single-sign-on,saml,Php,Single Sign On,Saml,第一次尝试将SAML实现为SP。我们决定尝试在定制的MVC框架中使用SimpleSAMLphp,因为我们认为这样可以节省时间 我遇到的问题是,我最终进入了一个无限循环,或者属性是空的 我已经在SimpleSAMLphp中配置了元数据并从authenticate接口对其进行了测试。idP有一个回发URL集,与我们开始的位置不同,因此: 用户点击domain.com/sso我们创建了新的SimpleSAML\u Auth\u Simple('our-configured-sp') 调用$as->r

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

我遇到的问题是,我最终进入了一个无限循环,或者属性是空的

我已经在SimpleSAMLphp中配置了元数据并从authenticate接口对其进行了测试。idP有一个回发URL集,与我们开始的位置不同,因此:

  • 用户点击domain.com/sso我们创建了新的
    SimpleSAML\u Auth\u Simple('our-configured-sp')
  • 调用
    $as->requireAuth()
  • 客户端被重定向到idP
  • idP将用户重定向回domain.com/sso/saml
如果我们这样做,我们必须使用相同的代码创建一个新实例(
$as=new SimpleSAML\u Auth\u Simple('our-configured-sp')
),当我们这样做时,
$as->getAttributes()
它是一个空数组。我们正在使用
phpsession
存储。键入
,但当我查看域上的cookie时,我只看到
PHPSESSID
simplesamlauthortoken

所以我们试着把它全部放在一个方法中。如上所述,只有您从domain.com/sso/saml开始,但这次循环会不断重复。用户访问我们的域,被重定向到idP,然后重定向回我们,然后再返回idP,直到永远

最终我放弃了。我可以在
$\u POST['SAMLResponse']
中获得响应,我可以
base64\u decode()
查看它的内容。我将它放入一个
simplexmlement
对象中,并能够使用它。问题是数据是加密的,现在我一直在尝试解密它

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

  • 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\u-RIJNDAEL\u解密(mcrypt\u-RIJNDAEL\u 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完成整个工作,如果不是,我会接受一些关于如何解密文件的指导

谢谢大家

请查看SAML php库,它有很好的文档和代码。您可以轻松地使用它来processResponse,getAttributes可以做您想做的事情


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

我们尝试了一次登录,结果发现它不支持我们需要的东西。。。我不记得那是什么了,因为那几乎是两年前的事了,但它不起作用。。。但愿我能记得那是什么。当时可能缺少对加密有效载荷的支持?我们确实让SimpleSAMLphp在您的头脑中工作,但我希望在不需要比整个应用程序更大的库的情况下管理它