2016-10-29 52 views
2

我目前正在构建一个应该处理Alexa语音意图的web服务。我从Alexa获得的HTTP请求必须通过检查签名进行验证,如documentation中所述(请参阅下面的摘录)。验证Alexa请求的签名

我似乎正确地解密了请求中发送的签名,似乎正确计算了请求主体的签名。但它们是不同的 - 但它们并不完全不同(它会暗示计算中存在一些错误),所计算的签名是发送签名的后缀。例如:

接收的签名(解码和解密的):

3021300906052b0e03021a05000414ca5cc3be233b045be79e94389e47353b7aaec434

计算请求主体(其SHA1哈希)的签名:

ca5cc3be233b045be79e94389e47353b7aaec434

什么额外的字节在收到签名的开始?他们之间似乎并没有改变请求。

各种信息:

  • 用于上述示例性签名的电流(2016年10月29日)certificate chain file
  • 原始接收的签名:从Alexa documentationM4Xq8WmUHjaR4Fgj9HUheoOUkZf4tkc5koBtkBq/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哈希值,以产生导出的散列值
  • 比较所断言的散列值和导出的散列值,以确保它们匹配

回答