View a markdown version of this page

驗證請求:使用查詢參數AWS (簽章第 4 版) - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

驗證請求:使用查詢參數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 版,您可以將此參數值設定為 AWS4-HMAC-SHA256。此字串可識別 AWS 簽章版本 4 (AWS 4) 和 HMAC-SHA256 演算法 (HMAC-SHA256)。

X-Amz-Credential

除了您的存取金鑰 ID 之外,此參數也提供簽章有效的範圍 (AWS 區域 和服務)。此值必須與您在簽章計算中使用的範圍相符,這將在下一節中討論。此參數值的一般格式如下:

<your-access-key-id>/<date>/<AWS 區域>/<AWS-service>/aws4_request

例如:

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

對於 Amazon S3, AWS服務字串為 s3。如需 S3 AWS-region字串的清單,請參閱《》中的區域和端點AWS 一般參考

X-Amz-Date

日期和時間格式必須遵循 ISO 8601 標準,且格式必須為「yyyyMMdd THHmmss Z」格式。例如,如果日期和時間是 "08/01/2016 15:32:41.982-700",則必須先將其轉換為 UTC (國際標準時間),然後以 "20160801T223241Z" 形式提交。

X-Amz-Expires

提供所產生預先簽章的 URL 有效的時段 (以秒為單位)。例如, 86400 (24 小時)。此值為整數。您可以設定的最小值為 1,最大值為 604800 (七天)。

預先簽章的 URL 最多可有效七天,因為您在簽章計算中使用的簽署金鑰最多可有效七天。

X-Amz-SignedHeaders

列出您用來計算簽章的標頭。簽章計算中需要下列標頭:

  • HTTP host標頭。

  • 您計劃新增至請求的任何x-amz-*標頭。

注意

為了提高安全性,您應簽署計劃包含在請求中的所有請求標頭。

X-Amz-Signature

提供簽章以驗證您的請求。此簽章必須符合 Amazon S3 計算的簽章;否則,Amazon S3 會拒絕請求。例如 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7

簽章計算將在下一節中描述。

X-Amz-Security-Token

選用的憑證參數 (如果使用來自 STS 服務的憑證)。

計算簽章

下圖說明簽章計算程序。

AWS Signature 第 4 版簽署程序,包含正式請求、要簽署的字串和簽章產生步驟。

下表描述圖表中顯示的函數。您需要為這些函數實作程式碼。

函式 說明
Lowercase() 將字串轉換成小寫。
Hex() 小寫基數 16 編碼。
SHA256Hash() 安全雜湊演算法 (SHA) 加密雜湊函數。
HMAC-SHA256() 使用 SHA256 演算法搭配提供的簽署金鑰來計算 HMAC。這是最後的簽章。
Trim() 移除任何前置和結尾空格。
UriEncode()

URI 編碼每個位元組。UriEncode() 必須強制執行下列規則:

  • URI 對除未預留字元之外的每個位元組進行編碼:'A'-'Z', 'a'-'z', '0'-'9', '-', '.', '_', and '~'。

  • 空格字元是預留字元,必須編碼為 "%20" (而不是 "+")。

  • 每個 URI 編碼的位元組都是由 '%' 和位元組的兩位數十六進位值組成。

  • 十六進位值中的字母必須為大寫,例如 "%1A"。

  • 對所有位置的正斜線字元 '/' 進行編碼 (物件索引鍵名稱除外)。例如,如果物件索引鍵名稱為 photos/Jan/sample.jpg,則不會對索引鍵名稱中的正斜線進行編碼。

重要

由於基礎 RFC 中的實作差異和相關模糊性,您的開發平台提供的標準 UriEncode 函數可能無法工作。我們建議您編寫自己的自訂 UriEncode 函數,以確保您的編碼能夠正常工作。

以下是 Java 中的 UriEncode() 函數範例。

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

如需簽署程序的詳細資訊 (建立正式請求、要簽署的字串和簽章計算的詳細資訊),請參閱 授權標頭的簽章計算:在單一區塊中傳輸承載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。此範例會進行下列額外假設:

您可以使用此範例做為測試案例來驗證程式碼計算的簽章;不過,您必須使用相同的儲存貯體名稱、物件金鑰、時間戳記和下列範例登入資料:

參數 Value
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  1. StringToSign
    1. 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

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. 簽章

    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>