我目前正在构建一个应该处理Alexa语音意图的网络服务。我必须通过检查签名来验证我从Alexa获得的HTTP请求,如documentation中所述(参见下面的摘录)。
我似乎正确解密了请求中发送的签名,似乎正确计算了请求正文的签名。但它们不同 - 但不是完全不同(这会暗示计算中的某些错误),计算的签名是发送签名的后缀。例如:
收到签名(解码和解密):
3021300906052b0e03021a05000414ca5cc3be233b045be79e94389e47353b7aaec434
请求正文的计算签名(其sha1哈希):
ca5cc3be233b045be79e94389e47353b7aaec434
收到签名开头的额外字节是多少?它们似乎不会在请求之间发生变化。
各种信息:
上述示例签名的原始收到签名: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哈希值以生成派生哈希值
- 比较断言的哈希值和派生的哈希值,以确保它们匹配
答案 0 :(得分:0)
通过谷歌搜索已发送签名的前缀3021300906052b0e03021a05000414
,我发现了the prefix is a constant that indicates the used hash algorithm。要么只是切断它,要么让OpenSSL做签名验证解决问题。永远不要酿造你自己的加密!