【问题标题】:Amazon Web Service Signature issue亚马逊网络服务签名问题
【发布时间】:2023-04-10 02:29:01
【问题描述】:

我正在尝试使用此处提到的此 URL 从亚马逊产品 API 获取产品相关数据:

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/ItemLookup.html

项目查找网址:

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 中输入了所需的详细信息/参数,但我无法理解从何处获取此签名或如何生成此签名?任何帮助将不胜感激。

【问题讨论】:

  • docs.aws.amazon.com/AWSECommerceService/latest/DG/… 使用请求类型、域、URI和请求中每个参数(除了Signature参数本身)的排序字符串创建签名,格式如下=&。正确格式化后,您可以使用 AWS 密钥创建 base64 编码的 HMAC_SHA256 签名。

标签: ruby-on-rails ruby web-services amazon-web-services amazon


【解决方案1】:

最简单、最快的方法是使用 AWS 开发工具包之一。您可以在此处找到完整列表:https://aws.amazon.com/tools/

使用 SDK 时,您只需提供访问密钥和密钥。库负责准备签名。

【讨论】:

  • 我使用了 AWS SDK,但它只返回您自己添加的产品详细信息。而就我而言,我想访问亚马逊上所有公共产品的详细信息。我需要一个 API 或可以返回我产品详细信息的东西
  • 如果你已经可以使用 API 那么我看不出它与签名有什么关系。
  • 请参阅我想要一个 API 来获取亚马逊上的公共产品。这个 AWS SDK 基本上对我没有多大帮助。它可以帮助我获取我上传的与 S3 相关的东西,但这不是我想要的。我需要一个可以获取产品及其详细信息的 API,如下所示:amazon.com/s/… 现在这里列出的产品。这些是我通过 API 需要的。
【解决方案2】:

好吧,在 Ruby 中自己做这件事是没有意义的,一旦它有一个 SDK,但关于签名过程的解释可能对某些人有用。

签名是 AWS 对 API 请求进行身份验证的方式。它在您的 HTTP 请求中作为查询字符串参数传递,并根据您自己的请求内容和您在服务器端的凭据进行验证。

它有 2 个版本:2 和 4,解释为 herehere。较新的地区(中国和法兰克福)不支持版本 2。

在我更熟悉的版本 2 中,签名是基于具有以下格式的字符串生成的:

HTTPVerb + "\n" + ValueOfHostHeaderInLowercase + "\n" + HTTPRequestURI
+ "\n" + CanonicalizedQueryString

CanonicalizedQueryString 是您的查询字符串,其参数按参数名称排序(UTF-8 字节顺序),参数值采用 url 编码。

然后您使用您的 AWS 密钥SHA256SHA1 计算该字符串的 HMAC作为哈希算法(取决于您在查询字符串参数 SignatureMethod 中指定的算法),并将其编码为 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

那么,经过这一切,你最终会得到这样的结果:

xrIYF8wO0C8YOQgcdpq6MoJpBWzXEWxuTBAAoqYoGWM=

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

&Signature=xrIYF8wO0C8YOQgcdpq6MoJpBWzXEWxuTBAAoqYoGWM%3D

希望,如果您做的一切正确(将符号字符串放在一起,生成哈希并对其进行编码),您的请求将被接受,并且如果您有足够的权限,则执行。

所以,如您所见,这是不值得自己做的事情。使用 SDK。 ;)

【讨论】:

    【解决方案3】:

    谢谢大家的回复。但我终于弄清楚了我的问题,我的解决方案就在这个 gem 中:

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

    这正是我真正想要的,它最终帮助我实现了我的目标。将其发布在这里,以便人们找到更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多