Web Services Amazon Web服务签名问题

ztigrdn8  于 2023-03-13  发布在  其他
关注(0)|答案(3)|浏览(181)

我正在尝试使用这里提到的此URL从Amazon产品API获取产品相关数据:
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/ItemLookup.html
项目查找URL:

http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=[AWS_Access_Key_ID]&Operation=ItemLookup&ItemId=B00008OE6I&Timestamp=[YYYY-MM-DDThh:mm:ssZ]&Signature=[Request_Signature]

我已在URL中输入了所需的详细信息/参数,但我无法理解从何处获取此签名或如何生成此签名?如有任何帮助,将不胜感激。

baubqpgj

baubqpgj1#

最简单快捷的方法是使用AWS SDK之一。您可以在此处找到完整列表:https://aws.amazon.com/tools/
当你使用SDK的时候,你只需要提供你的访问密钥和秘密密钥。库负责准备签名。

bgibtngc

bgibtngc2#

好吧,在Ruby中,一旦它有了SDK,你自己做这些就没有意义了,但是关于签名过程的解释可能对一些人有用。
签名是AWS验证API请求的方式。它作为HTTP请求上的查询字符串参数传递,并根据您自己的请求内容和服务器端的凭据进行验证。
它有两个版本:2和4,解释了herehere。较新的地区(中国和法兰克福)不支持版本2。
在我更熟悉的版本2中,签名是基于以下格式的字符串生成的:

HTTPVerb + "\n" + ValueOfHostHeaderInLowercase + "\n" + HTTPRequestURI
+ "\n" + CanonicalizedQueryString
  • CanonicalizedQueryString* 是您的查询字符串,其中的参数按参数名排序(UTF-8字节顺序),参数值采用URL编码。

然后,使用 *AWS密钥 * 和 * SHA 256 * 或 SHA1 作为散列算法(取决于您在查询字符串参数 SignatureMethod 上指定的算法)计算该字符串的 HMAC,并将其编码为base64。所有这些操作的结果将是 Signature 参数的值。
我将尝试向您介绍一个使用bash工具手动生成的 CloudWatch 请求。
假设您想要列出您的 CloudWatch 指标,请求(不带签名)如下所示。

http://monitoring.amazonaws.com/?AWSAccessKeyId=AVUKYAMNIIGWALNMA6IG&Action=ListMetrics&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2015-08-20T22%3A40%3A00.000Z&Version=2010-08-01

因此,要签名的字符串为:

GET
monitoring.amazonaws.com
/
AWSAccessKeyId=AVUKYAMNIIGWALNMA6IG&Action=ListMetrics&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2015-08-20T22%3A40%3A00.000Z&Version=2010-08-01

好吧,让我们把它放在一个变量中,然后做所有的魔术(hmac + base64)

#!/bin/bash

# your secret key
key='ry+SyjvXLvi4lYie/QfZYnxYOBQDggf01DTUxFSK'

# using 'read' to assign the signing string
# to a variable for readability reasons
read -r -d '' payload <<EOF
GET
monitoring.amazonaws.com
/
AWSAccessKeyId=AVUKYAMNIIGWALNMA6IG\
&Action=ListMetrics\
&SignatureMethod=HmacSHA1\
&SignatureVersion=2&\
Timestamp=2015-08-20T22%3A40%3A00.000Z\
&Version=2010-08-01
EOF

echo -n "$payload" | openssl dgst -sha256 -hmac $key -binary | openssl enc -base64

然后,在这一切之后,你会得到这样的结果:


这是您的签名,最后,您只需要对它进行url编码,并将其作为另一个查询字符串参数附加到请求中。

***和签名=

如果一切都做对了(将符号字符串放在一起,生成散列并对其进行编码),您的请求将被接受,并且如果您有足够的权限,将被执行。
所以,正如你所看到的,这件事不值得你自己去做。使用SDK。)

falq053o

falq053o3#

谢谢你们的回应。但我终于找到了我的问题,我的解决方案是在这个宝石:

https://github.com/jugend/amazon-ecs

这就是我真正在寻找的,它最终帮助我实现了我想要的。把它贴在这里,这样人们就可以找到更好的解决方案。

相关问题