【问题标题】:OKTA SAML Signature verfication - PHPOKTA SAML 签名验证 - PHP
【发布时间】:2016-01-14 14:05:31
【问题描述】:

我的应用程序 (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。 我错过了什么吗?

【问题讨论】:

    标签: php digital-signature saml-2.0 okta


    【解决方案1】:

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

    我们希望他们提供的库使使用他们的服务更加容易。

    【讨论】:

      【解决方案2】:

      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 上维护的一个分支中。

      【讨论】:

        猜你喜欢
        • 2021-12-18
        • 2013-10-28
        • 1970-01-01
        • 2014-02-08
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多