我目前正在构建一个应该处理Alexa语音意图的web服务。我从Alexa获得的HTTP请求必须通过检查签名进行验证,如documentation中所述(请参阅下面的摘录)。验证Alexa请求的签名
我似乎正确地解密了请求中发送的签名,似乎正确计算了请求主体的签名。但它们是不同的 - 但它们并不完全不同(它会暗示计算中存在一些错误),所计算的签名是发送签名的后缀。例如:
接收的签名(解码和解密的):
3021300906052b0e03021a05000414ca5cc3be233b045be79e94389e47353b7aaec434
计算请求主体(其SHA1哈希)的签名:
ca5cc3be233b045be79e94389e47353b7aaec434
什么额外的字节在收到签名的开始?他们之间似乎并没有改变请求。
各种信息:
- 用于上述示例性签名的电流(2016年10月29日)certificate chain file
原始接收的签名:从Alexa documentation
M4Xq8WmUHjaR4Fgj9HUheoOUkZf4tkc5koBtkBq/nCmh4X6EiimBXWa7p+kHoMx9noTdytGSUREaxYofTne1CzYOW0wxb9x6Jhor6lMwHAr4cY+aR1AEOkWrjsP94bewRr1/CxYNl7kGcj4+QjbEa/7dL19BNmLiufMLZDdRFsZSzlfXpPaAspsoStqVc/qc26tj5R9wtB0sTS4wbFc4eyCPFaCZocq1gmjfR3YQXupuD7J3slrz54SxukNmL/M1CIoZ8lOXjS82XLkKjsrzXdY5ePk8XsEDjNWkFSLbqzBzGBqzWx4M913uDA6gPx5tFKeoP8FgpV+BHKDf3d4gmQ==
- 摘录:
检查请求的签名
请求Alexa的发送提供您需要验证在HTTP报头中的签名信息:
-
Signature
验证签名:
验证请求中SignatureCertChainUrl标头值指定的URL,以确保它与Amazon使用的格式相匹配。请参阅验证签名证书URL。
下载Alexa用于签署消息的PEM编码的X.509证书链,如请求中的SignatureCertChainUrl标头值所指定。
此链在运行时提供,因此证书可能会定期更新,因此您的Web服务应该对具有不同内容的不同URL具有弹性。
- 此证书链按顺序包括(1)亚马逊签名证书和(2)一个或多个额外证书,这些证书为根证书颁发机构(CA)证书创建信任链。签字确认证书的有效性,进行以下检查:
- 的签名证书尚未过期(同时检查后没有之前的日期和Not)
- 域名echo-api.amazon.com存在在签名证书的主题备用名称(SAN)的部分
- 链中的所有证书相结合,创造信任链到受信任的根CA证书
- 一旦你已经确定签名证书是否有效,从中提取公钥。
- Base64解码请求上的签名标头值以获得加密签名。
- 使用自签名证书提取的公共密钥来解密加密的签名产生断言哈希值。
- 生成从全HTTPS请求主体中的SHA-1哈希值,以产生导出的散列值
- 比较所断言的散列值和导出的散列值,以确保它们匹配