PHP Saml 2.0,无法验证哈希值(摘要或签名)

时间:2015-08-31 20:44:08

标签: php saml saml-2.0

我需要你帮助弄清楚我在验证哈希值方面做错了什么。我把代码放在一个Gist中,这样就可以在不需要进行大量滚动的情况下查看它。

像这样的示例令牌在这里发送:

https://gist.github.com/NoMan2000/3d3044e8d653a1d580ac#file-saml-xml

我正在尝试检查两个字段,DigestValue和SignatureValue。据我了解,DigestValue是通过查看应用的变换并应用DigestMethod中指定的散列算法来计算的。

该哈希是来自原始二进制输出的哈希算法的base64编码版本。

变换说“删除签名块中的所有内容,使用C14N转换字符串以规范化输出,并根据参考URI中给出的id计算散列”:我基于我在此处阅读的内容:

http://www.w3.org/TR/xmldsig-core/#sec-TransformAlg

然而,使用哈希等抓取算法不起作用。我总是没能通过检查。

https://gist.github.com/NoMan2000/3d3044e8d653a1d580ac#file-samlcontroller-php-L296

同样,每当我尝试验证SignatureValue时,我的印象是SignatureValue是使用SignatureMethod算法中指定的SSL算法通过公钥加密的DigestValue。

所以这行代码应该有效:

$verify = openssl_verify($digestValue, base64_decode($signatureValue), $pubkeyid, $algo);

但是验证总是返回0.当我阅读文档时,它是散列代码的二进制版本的字符串,加上公钥和算法。

我已经尝试了几十种显示的代码变体,但从未设法随意使用它。有谁看到我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用LightSAML。以下是签名验证的示例http://www.lightsaml.com/LightSAML-Core/Cookbook/How-to-verify-signature-of-SAML-message/

一旦反序列化SAML响应,签名验证本身就可以像这样完成

// deserialize from XML ...
$response = new \LightSaml\Model\Protocol\Response();

// load IDP certificate
$key = \LightSaml\Credential\KeyHelper::createPublicKey(
    \LightSaml\Credential\X509Certificate::fromFile('idp.crt')
);

// validate the signature, will throw an Exception if invalid
$response->getSignature()->validate($key);

答案 1 :(得分:0)

我选择了Milos Tomic的答案,但是使用了OneLogin。代码几乎相同:

$pubCert = '/path/to/crt/';
$doc = new DOMDocument();
$doc->loadXML($SAMLResponse); // What the server sends over.
$pubkeyid = openssl_x509_read("file://$pubCert");
$validate = OneLogin_Saml2_Utils::validateSign($doc, $pubkeyid);
相关问题