You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:03