PHP开发Alexa自定义技能请求验证哈希值不匹配问题求助
错误原因及修复方案
1. 请求体哈希生成逻辑错误
你使用json_encode($_POST)计算请求哈希的方式不符合要求:$_POST是PHP解析表单数据后的结构化数组,而Alexa发送的是未经过处理的原始JSON请求体,二者的字段顺序、转义规则、空白字符完全不同,生成的哈希必然不匹配。
必须直接读取原始请求体计算哈希:
// 替换原来的 $request_body_sha1 = sha1(json_encode($_POST)); $raw_request_body = file_get_contents('php://input'); $request_body_sha1 = sha1($raw_request_body);
2. 签名验证逻辑错误
你的解密和比对逻辑存在两处错误:
- Alexa的签名使用PKCS#1 v1.5填充加密,你使用
OPENSSL_NO_PADDING参数解密会导致解密结果包含大量无效填充字节 - 解密后的
$decrypted本身就是Alexa端生成的原始请求体SHA1哈希值,不需要再次对其做sha1()运算,否则相当于对哈希值二次哈希,必然比对失败
推荐直接使用PHP内置的openssl_verify函数完成签名验证,无需手动处理解密和填充,可靠性更高:
// 替换原来的解密、哈希比对代码块 $get_encrypted_signature = base64_decode($_SERVER['HTTP_SIGNATURE']); $verify_result = openssl_verify( $raw_request_body, $get_encrypted_signature, $signed_cert_public_key, OPENSSL_ALGO_SHA1 ); if ($verify_result === 1) { // 签名验证通过 $invalid = false; }
3. 可选优化项
你当前仅验证了单个证书的有效期,没有校验证书链的信任关系,存在伪造证书的攻击风险,建议补充使用openssl_x509_verify函数完成证书链的合法性校验。
内容的提问来源于stack exchange,提问作者lazyCoder
相关产品推荐
相关产品推荐

