OKTA SAML签名验证 - PHP

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

当我将数据的值赋为发送到应用程序的SAML响应时,我总是得到0。我是否漏掉了什么?
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

2

使用正确的工具非常重要。我们刚开始走上这条路,发现了OKTA开发者工具,可以在OKTA网站上找到:http://developer.okta.com/docs/sdk/core/api.html

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接