好吧,在 Ruby 中自己做这件事是没有意义的,一旦它有一个 SDK,但关于签名过程的解释可能对某些人有用。
签名是 AWS 对 API 请求进行身份验证的方式。它在您的 HTTP 请求中作为查询字符串参数传递,并根据您自己的请求内容和您在服务器端的凭据进行验证。
它有 2 个版本:2 和 4,解释为 here 和 here。较新的地区(中国和法兰克福)不支持版本 2。
在我更熟悉的版本 2 中,签名是基于具有以下格式的字符串生成的:
HTTPVerb + "\n" + ValueOfHostHeaderInLowercase + "\n" + HTTPRequestURI
+ "\n" + CanonicalizedQueryString
CanonicalizedQueryString 是您的查询字符串,其参数按参数名称排序(UTF-8 字节顺序),参数值采用 url 编码。
然后您使用您的 AWS 密钥 和 SHA256 或 SHA1 计算该字符串的 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。 ;)