AWS API无法验证查询字符串(特别是 - " VpcId = vpc-1738886c")

时间:2018-03-11 20:50:59

标签: python python-3.x api amazon-web-services

我正在尝试为子网创建发送API查询。请注意,验证码正在运行,问题只在于参数字符串:

request_parameters = 'Action=CreateSubnet&**VpcId=vpc-1738886c**&CidrBlock=20.20.3.0%2F28&Version=2016-11-15'

当我发送此消息时,我得到: AWS无法验证提供的访问凭据

对于完全相同的代码,当我发送时:

"request_parameters = 'Action=CreateVpc&CidrBlock=20.20.3.0%2F24&Version=2016-11-15'"    #  It works!!

我猜测有问题: VpcId = vpc-1738886c

作为同一个用户,我能够在控制台中使用相同的CIDR块在该VPC中创建子网,因此权限似乎不是问题。

你能告诉我吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

" AWS无法验证提供的访问凭据" 意味着您在签名代码中存在问题 - 而不是实际问题参数。

最初,很难理解为什么会出现这种情况,这里......但事实确实如此。

问题在于您需要签署查询字符串的规范表示 ...这意味着在签名时必须以词法方式对参数进行排序:

# canonical representation
Action=CreateSubnet&CidrBlock=20.20.3.0%2F28&Version=2016-11-15&VpcId=vpc-1738886c

对于查询字符串的参数在Internet上端到端更改的顺序,没有安全的假设,因此AWS签名算法要求对它们进行排序以进行签名。实际HTTP请求中的顺序并不重要,但签名时的顺序确实如此。