Как декодировать зашифрованный ответ SAML от idP с помощью PHP?

Впервые пытаюсь внедрить 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(), это будет пустой массив. Мы используем phpsession store.type, но когда я смотрю на файлы cookie в домене, я вижу только PHPSESSID и SimpleSAMLAuthToken

Поэтому мы попытались объединить все это в один метод. Как и выше, только вы начинаете с 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'
    )
);

В авторских источниках есть это:

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

Любая помощь? Предпочтительно, чтобы все это работало с SimpleSAMLphp, но если нет, я бы взял небольшое руководство о том, как расшифровать файл.

Всем спасибо


person Engineer81    schedule 20.08.2013    source источник


Ответы (1)


Пожалуйста, проверьте php-библиотеку One ​​Login SAML. Она хорошо документирована и закодирована. Вы можете легко использовать его для обработки ответа, а getAttributes делает то, что вы хотите.

Я знаю, что вопрос старый, но он может помочь кому-то, кто все еще ищет то же самое.

person Irfan.gwb    schedule 03.08.2015
comment
Мы попробовали One Login, и оказалось, что он не поддерживает то, что нам было нужно... Я не помню, что это было, потому что это было почти два года назад, но это не сработало... Жаль, что я не мог вспомни что было. Возможно, в то время отсутствовала поддержка зашифрованных полезных данных? У нас действительно работает SimpleSAMLphp, но я надеялся управлять всем этим без необходимости в библиотеке, которая была бы больше, чем все наше приложение. - person Engineer81; 03.08.2015