OKTA SAML签名验证- PHP


OKTA SAML Signature verfication - PHP

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

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

My Code

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

当我将数据值指定为发送给应用程序的SAML响应时,我总是得到0。我错过什么了吗?

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单点登录配置文件,并集成了Symfony的安全性,使SAML单点登录非常容易实现。

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

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

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