4

我的应用程序 (PHP) 从 OKTA 获得具有签名值的 SAML 响应,并且我还拥有具有公钥的 OKTA 证书。我的应用程序执行以下操作,

  1. 从证书中获取公钥。
  2. 从发送给它的 SAML 中获取签名值。
  3. 现在,它使用函数 openssl_verify($data, $signature, $pubkeykey,"sha1WithRSAEncryption"); 由于 $data 是 OKTA 用于签署 saml 响应的内容,我不确定 $data 必须设置什么。

我的代码,

$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");

当我将 data 的值分配为发送到应用程序的 SAML 响应时,我总是得到 0。我错过了什么吗?

4

2 回答 2

5

SAML 签名验证远不止调用openssl_verify()函数。我建议为此目的使用一些库,例如https://github.com/lightSAML/lightSAML

在这种情况下,使用 LightSAML-Core,可以按照他们的食谱页面http://www.lightsaml.com/LightSAML-Core/Cookbook/How-to-verify-signature-of-SAML-message/中的说明完成签名验证在以下步骤中

  • 将 XML 反序列化为数据模型对象 - 在您的情况下为 Response 类
  • 从其元数据的证书中加载 IDP 的公钥
  • validate()响应签名属性上的调用方法

请注意,正确处理响应不仅仅是验证签名。完整的 SAML Web 浏览器 SSO 配置文件地址附加验证,LightSAML 也实施。

如果您使用 Symfony,您可能会检查LightSAML/SpBundle ,因为它实现了完整的 SAML SSO 配置文件并与 Symfony 的安全性集成,使得 SAML SSO 很容易实现。

如果您真的想从头开始自己做,您可以检查 xmlseclibs 是如何做到的,例如在https://github.com/robrichards/xmlseclibs上维护的其中一个分支中。

于 2015-12-15T09:25:57.270 回答
2

是的,使用正确的工具很重要。我们刚刚开始走这条路,并在 OKTA 网站上找到了 OKTA 开发人员工具:http: //developer.okta.com/docs/sdk/core/api.html

我们希望他们提供的库可以更轻松地使用他们的服务。

于 2016-01-27T18:39:16.653 回答