本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
驗證請求:使用查詢參數AWS (簽章第 4 版)
如身分驗證概觀中所述 (請參閱身分驗證方法),您可以使用查詢字串參數提供身分驗證資訊。當您想要完全在 URL 中表達請求時,使用查詢參數來驗證請求非常有用。此方法也稱為預先簽署 URL。
預先簽章 URLs 的使用案例是,您可以授予暫時存取 Amazon S3 資源的權限。例如,您可以在網站上嵌入預先簽章的 URL,或將其用於命令列用戶端 (例如 Curl) 以下載物件。
注意
您也可以使用 AWS CLI 來建立預先簽章URLs。如需詳細資訊,請參閱《AWS CLI 命令參考》中的 presign。
以下是預先簽章的 URL 範例。
https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request &X-Amz-Date=20130721T201207Z &X-Amz-Expires=86400 &X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
在範例 URL 中,請注意下列事項:
-
新增換行以獲得可讀性。
-
URL 中的
X-Amz-Credential值僅為了便於閱讀而顯示 "/" 字元。實際上,它應該編碼為%2F。例如:&X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
下表描述 URL 中提供驗證資訊的查詢參數。
| 查詢字串參數名稱 | 範例值 |
|---|---|
X-Amz-Algorithm |
識別 AWS Signature 的版本,以及您用來計算簽章的演算法。 對於 AWS Signature 第 4 版,您可以將此參數值設定為 |
X-Amz-Credential |
除了您的存取金鑰 ID 之外,此參數也提供簽章有效的範圍 (AWS 區域 和服務)。此值必須與您在簽章計算中使用的範圍相符,這將在下一節中討論。此參數值的一般格式如下:
例如:
對於 Amazon S3, |
X-Amz-Date |
日期和時間格式必須遵循 ISO 8601 標準,且格式必須為「 |
X-Amz-Expires |
提供所產生預先簽章的 URL 有效的時段 (以秒為單位)。例如, 預先簽章的 URL 最多可有效七天,因為您在簽章計算中使用的簽署金鑰最多可有效七天。 |
X-Amz-SignedHeaders |
列出您用來計算簽章的標頭。簽章計算中需要下列標頭:
注意為了提高安全性,您應簽署計劃包含在請求中的所有請求標頭。 |
X-Amz-Signature |
提供簽章以驗證您的請求。此簽章必須符合 Amazon S3 計算的簽章;否則,Amazon S3 會拒絕請求。例如 簽章計算將在下一節中描述。 |
X-Amz-Security-Token |
選用的憑證參數 (如果使用來自 STS 服務的憑證)。 |
計算簽章
下圖說明簽章計算程序。
下表描述圖表中顯示的函數。您需要為這些函數實作程式碼。
| 函式 | 說明 |
|---|---|
Lowercase() |
將字串轉換成小寫。 |
Hex() |
小寫基數 16 編碼。 |
SHA256Hash() |
安全雜湊演算法 (SHA) 加密雜湊函數。 |
HMAC-SHA256() |
使用 SHA256 演算法搭配提供的簽署金鑰來計算 HMAC。這是最後的簽章。 |
Trim() |
移除任何前置和結尾空格。 |
UriEncode() |
URI 編碼每個位元組。UriEncode() 必須強制執行下列規則:
重要由於基礎 RFC 中的實作差異和相關模糊性,您的開發平台提供的標準 UriEncode 函數可能無法工作。我們建議您編寫自己的自訂 UriEncode 函數,以確保您的編碼能夠正常工作。 以下是 Java 中的 UriEncode() 函數範例。
|
如需簽署程序的詳細資訊 (建立正式請求、要簽署的字串和簽章計算的詳細資訊),請參閱 授權標頭的簽章計算:在單一區塊中傳輸承載AWS (簽章第 4 版)。程序通常相同,但在預先簽章的 URL 中建立 CanonicalRequest 會有所不同,如下所示:
-
正式請求中不包含承載雜湊,因為當您建立預先簽章的 URL 時,您不知道承載內容,因為 URL 用於上傳任意承載。反之,您可以使用常數字串
UNSIGNED-PAYLOAD。 -
正式查詢字串必須包含上述資料表中的所有查詢參數,但 除外
X-Amz-Signature。 -
對於 S3,如果使用來自 STS 服務的登入資料,則必須在 URL 中包含
X-Amz-Security-Token查詢參數。 -
正式標頭必須包含 HTTP
host標頭。如果您計劃包含任何x-amz-*標頭,也必須新增這些標頭以進行簽章計算。您可以選擇性地新增計劃包含在請求中的所有其他標頭。為了提高安全性,您應該盡可能簽署多個標頭。如果您新增的已簽章標頭也是已簽章的查詢參數,且其值不同,則當輸入發生衝突時,您會收到InvalidRequest錯誤。
範例
假設您的儲存examplebucket貯體test.txt中有物件。您想要透過建立預先簽章的 URL,與其他人共用此物件 24 小時 (86400 秒)。
https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
下列步驟會先說明簽章計算,然後建構預先簽章的 URL。此範例會進行下列額外假設:
-
請求時間戳記為
Fri, 24 May 2013 00:00:00 GMT。 -
儲存貯體位於美國東部 (維吉尼亞北部) 區域,而登入資料
Scope和Signing Key計算會使用us-east-1做為區域指標。 如需詳細資訊,請參閱 https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region 中的 AWS 一般參考區域與端點。
您可以使用此範例做為測試案例來驗證程式碼計算的簽章;不過,您必須使用相同的儲存貯體名稱、物件金鑰、時間戳記和下列範例登入資料:
| 參數 | Value |
|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
AWSSecretAccessKey |
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
-
StringToSign
-
CanonicalRequest
GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
簽章
aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404現在您已擁有建構預先簽章 URL 的所有資訊。此範例產生的 URL 如下所示 (您可以使用此 URL 來比較預先簽章的 URL):
https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
範例 2
以下是範例 (與上一個範例無關),顯示具有 X-Amz-Security-Token 參數的預先簽章 URL。
https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>