使用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
相关产品推荐
相关产品推荐

