验证Alexa请求的签名

时间:2016-10-29 15:46:24

标签: digital-signature alexa-skills-kit

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

我似乎正确解密了请求中发送的签名,似乎正确计算了请求正文的签名。但它们不同 - 但不是完全不同(这会暗示计算中的某些错误),计算的签名是发送签名的后缀。例如:

收到签名(解码和解密):

3021300906052b0e03021a05000414ca5cc3be233b045be79e94389e47353b7aaec434

请求正文的计算签名(其sha1哈希):

ca5cc3be233b045be79e94389e47353b7aaec434

收到签名开头的额外字节是多少?它们似乎不会在请求之间发生变化。

各种信息:

  • 当前(2016-10-29)certificate chain file
  • 上述示例签名的原始收到签名:M4Xq8WmUHjaR4Fgj9HUheoOUkZf4tkc5koBtkBq/nCmh4X6EiimBXWa7p+kHoMx9noTdytGSUREaxYofTne1CzYOW0wxb9x6Jhor6lMwHAr4cY+aR1AEOkWrjsP94bewRr1/CxYNl7kGcj4+QjbEa/7dL19BNmLiufMLZDdRFsZSzlfXpPaAspsoStqVc/qc26tj5R9wtB0sTS4wbFc4eyCPFaCZocq1gmjfR3YQXupuD7J3slrz54SxukNmL/M1CIoZ8lOXjS82XLkKjsrzXdY5ePk8XsEDjNWkFSLbqzBzGBqzWx4M913uDA6gPx5tFKeoP8FgpV+BHKDf3d4gmQ==

  

检查请求的签名

     

Alexa发送的请求提供了验证HTTP标头中签名所需的信息:

     
      
  • SignatureCertChainUrl
  •   
  • Signature
  •   
     

验证签名:

     
      
  • 验证请求上SignatureCertChainUrl标头值指定的URL,以确保它与Amazon使用的格式匹配。请参阅验证签名证书URL。

  •   
  • 下载由Alexa用于签署消息的PEM编码的X.509证书链,该消息由请求上的SignatureCertChainUrl标头值指定。

  •   
  • 此链在运行时提供,因此证书可能会定期更新,因此您的Web服务应该能够适应不同内容的不同网址。

  •   
  • 此证书链按顺序由(1)Amazon签名证书和(2)一个或多个其他证书组成,这些证书为根证书颁发机构(CA)证书创建信任链。要确认签名证书的有效性,请执行以下检查:      
        
    • 签名证书尚未过期(同时检查Not Before和Not After日期)
    •   
    • 域名echo-api.amazon.com出现在签名证书的主题备用名称(SAN)部分中
    •   
    • 链中的所有证书组合在一起,以创建对受信任的根CA证书的信任链
    •   
  •   
  • 确定签名证书有效后,从中提取公钥。
  •   
  • Base64-解码请求上的Signature标头值以获取加密签名。
  •   
  • 使用从签名证书中提取的公钥解密加密的签名,以生成声明的哈希值。
  •   
  • 从完整HTTPS请求正文生成SHA-1哈希值以生成派生哈希值
  •   
  • 比较断言的哈希值和派生的哈希值,以确保它们匹配
  •   

1 个答案:

答案 0 :(得分:0)

通过谷歌搜索已发送签名的前缀3021300906052b0e03021a05000414,我发现了the prefix is a constant that indicates the used hash algorithm。要么只是切断它,要么让OpenSSL做签名验证解决问题。永远不要酿造你自己的加密!