那麼,一旦擁有SDK,在Ruby中自己做這件事就毫無意義了,但是對於簽名過程的解釋可能對某些人有用。
簽名是AWS驗證API請求的方式。它作爲查詢字符串參數傳遞給您的HTTP請求,並根據您自己的請求內容和您在服務器端的憑據進行驗證。
有2個版本:2和4,解釋爲here和here。新版區域(中國和法蘭克福)不支持版本2。
在2版本,我更熟悉,基於這種格式的字符串生成的簽名:
HTTPVerb + "\n" + ValueOfHostHeaderInLowercase + "\n" + HTTPRequestURI
+ "\n" + CanonicalizedQueryString
的CanonicalizedQueryString是您的查詢字符串,用排序參數(UTF- 8字節順序)由參數名稱和參數值url編碼。
然後你(這取決於您的查詢字符串參數指定是SignatureMethod其中之一計算該字符串的HMAC,使用AWS密鑰和SHA256或SHA1作爲哈希算法),並將其編碼爲base64。所有這些的結果將是簽名參數的值。
我將嘗試引導您通過CloudWatch請求,使用bash工具手動生成該請求。
假設您想列出您的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
然後,畢竟,你會結束了這樣的事情:
xr IYF8wO0C8YOQgcdpq6MoJpBWzXEWxuTBAAoqYoGWM =
這是你的簽名,最後,你只需要URL編碼它並將它添加到您的要求爲一體的多個查詢字符串參數。
&簽名= xrIYF8wO0C8YOQgcdpq6MoJpBWzXEWxuTBAAoqYoGWM%3D
我們希望,如果你正確地做了一切(把符號串起來,生成散列並將其編碼),您的請求將會被接受,如果你有足夠的權限,執行。
所以,正如你所看到的,這是不值得自己去做的事情。使用SDK。 ;)
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/HMACAuth_ItemsRequired.html _A簽名是通過使用請求中的每個參數的請求類型,域,URI和有序字符串創建的(除簽名參數本身外)採用以下格式 = &。一旦格式正確,您就可以使用AWS密鑰創建base64編碼的HMAC_SHA256簽名._ –