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