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

使用Alexa SDK验证请求签名失败,求解码及SHA-1哈希实现方案

手动验证Alexa语音请求签名的实现步骤

针对你提到的使用SkillRequestSignatureVerifier验证失败的问题,我们可以拆解手动验证的核心步骤,重点解决你关注的「从证书提取公钥验证签名」和「生成请求体SHA-1哈希」这两个环节:


一、从Alexa签名证书提取公钥

Alexa提供的证书是X.509格式的PEM文件,我们需要先加载证书,再从中提取公钥。以下是Java实现示例:

import java.io.InputStream;
import java.net.URL;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.PublicKey;

public PublicKey getAlexaPublicKey(String certUrl) throws Exception {
    // 加载证书文件
    URL certAddress = new URL(certUrl);
    try (InputStream certStream = certAddress.openStream()) {
        // 初始化X.509证书工厂
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        X509Certificate alexaCert = (X509Certificate) certFactory.generateCertificate(certStream);
        
        // 验证证书有效性(可选但建议:检查证书是否过期、是否由可信CA签发)
        alexaCert.checkValidity();
        
        // 提取公钥
        return alexaCert.getPublicKey();
    }
}

二、从HTTPS请求体生成SHA-1哈希值

关键注意事项:必须使用Alexa发送的原始请求体字节流,不能对内容进行任何修改(比如解析后重新序列化,这会改变字节结构导致哈希不匹配)。Java实现示例:

import java.security.MessageDigest;

public byte[] generateRequestBodySha1(byte[] rawRequestBody) throws Exception {
    // 初始化SHA-1消息摘要器
    MessageDigest sha1Digest = MessageDigest.getInstance("SHA-1");
    // 更新摘要内容为原始请求体字节
    sha1Digest.update(rawRequestBody);
    // 生成最终哈希字节数组
    return sha1Digest.digest();
}

三、使用公钥验证签名

Alexa提供的签名是Base64编码的,我们需要先解码为字节,再用公钥验证该签名是否与请求体哈希匹配(签名算法为SHA1withRSA):

import java.security.Signature;
import java.util.Base64;

public boolean verifyAlexaSignature(PublicKey publicKey, byte[] requestBodySha1, String signatureBase64) throws Exception {
    // 初始化RSA-SHA1签名验证器
    Signature signatureVerifier = Signature.getInstance("SHA1withRSA");
    signatureVerifier.initVerify(publicKey);
    // 传入请求体哈希值
    signatureVerifier.update(requestBodySha1);
    // 解码Base64格式的签名
    byte[] signatureBytes = Base64.getDecoder().decode(signatureBase64);
    // 执行验证
    return signatureVerifier.verify(signatureBytes);
}

可能导致SDK验证失败的额外检查点

SkillRequestSignatureVerifier除了上述核心验证,还会自动执行以下合规检查,这些也是你手动验证时需要注意的:

  • 证书的**主题备用名称(SAN)**必须匹配请求来源域名(如echo-api.amazon.com)
  • 证书链必须完整且由Alexa可信根CA签发
  • 请求的SignatureCertChainUrl必须是HTTPS协议且来自Alexa官方域名

如果你使用SDK验证失败,可以先排查这些前置条件是否满足,再用上述手动步骤逐步调试。

内容的提问来源于stack exchange,提问作者chaoqun lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:03