AWS XML 响应错误签名不匹配

AWS XML 响应错误签名不匹配

我有一个 bash 脚本,应该返回 AWS EC2 区域的 XML 响应,但我收到的 XML 错误响应如下:

“SignatureDoesNotMatch” 我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

EC2 Web 查询的签名方法是否正确?这是代码:

#!/bin/bash

dt=$(date +%FT%TZ | sed 's/:/%3A/g')
echo "$dt"

q="GET
ec2.amazonaws.com
/
Action=DescribeRegions&AWSAccessKeyId=<aws access key>&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=$dt&Version=2013-02-01"

sig=$(echo -en "$q" | openssl dgst -sha256 -hmac "<aws secret key>" -binary | openssl enc -base64)
echo "the signature is $sig"

curl --get --data-urlencode DATA "https://ec2.amazonaws.com/?Action=DescribeRegions&AWSAccessKeyId=<aws access key>&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=$dt&Version=2013-02-01&Signature=$sig"
echo -e "\n\n finished "

PS:出于安全原因删除了AWS访问密钥和AWS秘密密钥,它们工作得很好。

答案1

如果帖子包含真实代码,那么问题可能出--data-urlencode DATA在curl 请求中。这将导致&DATA附加到请求中,这当然不是您想要的。我相信您需要对签名进行 url 编码(“生成的签名必须先进行 base-64 编码,然后进行 URI 编码。”),您可以这样做:

curl --get --data-urlencode "Signature=$sig" "https://ec2.amazonaws.com/?Action=DescribeRegions&AWSAccessKeyId=<aws access key>&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=$dt&Version=2013-02-01"

我建议使用-v命令行选项来curl进行调试;它会让您看到实际的请求行,然后您可以将其与预期格式进行比较。

另外,请确保 的定义中没有尾随空格q

作为一个附带问题,没有理由将标志指定-eecho-e用于导致\序列\n更改为实际字符(0A在本例中为十六进制);您没有任何\in $q,因此无需重新编码。-e不是有必要引起参数中实际的换行符得到回显。

相关内容