Мое приложение (PHP) получает ответ SAML от OKTA, который имеет значение подписи, и у меня также есть сертификат OKTA, который имеет открытый ключ. Мое приложение делает следующее,
Мой код,
$pubkeyid = openssl_pkey_get_details(openssl_pkey_get_public(file_get_contents("okta.cert")));
$pubkeyid = $pubkeyid["key"];
$signature = "<get it form SAML Response>";
$data = ???? (what should be provided)
$ok = openssl_verify($data, $signature, $pubkeyid,"sha1WithRSAEncryption");
Я всегда получаю 0, когда назначаю значение данных для ответа SAML, отправляемого приложению.
Я что-то пропустил ?
Проверка подписи SAML намного больше, чем вызов openssl_verify()
функция. Я бы предложил использовать для этой цели какую-то библиотеку, например https://github.com/lightSAML/lightSAML.
В этом случае, используя LightSAML-Core, проверку подписи можно выполнить, как описано на странице их поваренной книги. http://www.lightsaml.com/LightSAML-Core/Cookbook/How-to-verify-signature-of-SAML-message/ в следующих шагах
validate()
метод для свойства подписи ответаОбратите внимание, что правильная обработка Ответа — это больше, чем просто проверка подписи. Полный профиль адресации единого входа в веб-браузере SAML, который также реализует LightSAML.
Вы можете проверить LightSAML / SpBundle если вы используете Symfony, так как он реализует полный профиль единого входа SAML и интегрируется с безопасностью Symfony, что делает SAML SSO довольно простым в реализации.
Если вы действительно хотите сделать это самостоятельно с нуля, вы можете проверить, как это делает xmlseclibs, например, в одной из поддерживаемых вилок на https://github.com/robrichards/xmlseclibs.
Да, использование правильных инструментов важно. Мы только начинаем идти по этому пути и нашли инструменты разработчика OKTA на сайте OKTA: http://developer.okta.com/docs/sdk/core/api.html.
Мы надеемся, что предоставляемые ими библиотеки значительно упростят использование их услуг.