簽署請求 - Amazon S3 Glacier

此頁面僅適用於使用保管庫和 2012 年起原始 REST API 的 S3 冰川服務的現有客戶。

如果您正在尋找存檔儲存解決方案,我們建議您使用 Amazon S3 中的 S3 Glacier 儲存類別、S3 冰川即時擷取S3 冰川彈性擷取和 S3 Glacier Deep Archive。若要進一步了解這些儲存選項,請參閱 Amazon S3 使用者指南中的 S3 Glacier 儲存類別和使用 S3 Glacier 儲存類別的長期資料儲存。這些儲存類別使用 Amazon S3 API,可在所有區域使用,並且可以在 Amazon S3 主控台中管理。它們提供了諸如存儲成本分析,存儲鏡頭,包括多種加密選項的安全功能等功能。

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

簽署請求

S3 Glacier 會要求您簽署請求,對您發送的每個請求進行身分驗證。若要簽署請求,請使用加密雜湊函數來計算數位簽章。加密雜湊是一個函數, 其根據輸入傳回一個唯一的雜湊值。此雜湊函數的輸入包含請求和私密存取金鑰的文字。雜湊函數會傳回一個雜湊值,您將此值包含在請求中做為簽章。該簽章是請求 Authorization 標頭中的一部分。

收到請求後,S3 Glacier 會使用您原先用以簽署請求的相同雜湊函數與輸入,重新計算簽章。如果產生的簽章符合請求中的簽章,則 S3 Glacier 會處理請求。否則,請求會遭到拒絕。

S3 Glacier 支援使用 AWS Signature 第 4 版進行身分驗證。計算簽章的程序可以分成三個任務:

  • 任務 1:建立正式請求

    將 HTTP 請求重新編排為正式格式。使用標準表單是必要的,因為 S3 Glacier 在重新計算簽章以與所傳送的簽章進行比較時,會使用相同的標準表單。

  • 任務 2:建立登入字串

    建立一個字串,您會使用此字串做為密碼編譯雜湊函數的其中一個輸入值。此字串,稱為登入字串,是雜湊演算法的名稱、請求日期、登入資料範圍字串和前一個任務的正式請求的串連。憑證範圍字串本身是日期、AWS 區域和服務資訊的串連。

  • 任務 3:建立簽章

    使用接受兩個輸入字串的密碼編譯雜湊函數來建立請求的簽章:您的 登入字串衍生金鑰。藉由從您的私密存取金鑰開始來計算此衍生金鑰和使用登入資料範圍 字串來建立一系列雜湊型訊息身分驗證代碼 (HMAC)。請注意,在此簽署步驟中所使用的雜湊函數不是用於上傳資料的 S3 Glacier API 中所使用的樹雜湊演算法。

簽章計算範例

以下範例會逐步解說為 建立文件庫 (PUT 文件庫) 建立簽章的詳細資訊 。此範例可用作檢查簽名簽章計算方法的參考。如需詳細資訊,請參閱《IAM 使用者指南》中的簽署 AWS API 請求

該範例假設如下:

  • 請求的時間戳記為 Fri, 25 May 2012 00:24:53 GMT

  • 端點是美國東部 (維吉尼亞北部) 區域 ( us-east-1)。

一般請求語法 (包括 JSON 內文) 是:

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

對於任務1:建立正式請求計算的請求的正式形式是:

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

正式請求的最後一行是請求內文的雜湊值。另外,請注意正式請求中的空的第三行。這是因為此 API 沒有查詢參數。

要為任務 2:建立要簽章的字串 簽章的字串是:

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

登入字串的第一行是演算法,第二行是時間戳記,第三行是登入資料範圍,最後一行是來自任務 1:建立正式請求的正式請求的雜湊。在憑證範圍內使用的服務名稱是 glacier

對於任務 3:建立簽章衍生金鑰可以呈現為:

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

如果使用私密存取金鑰 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY,則計算簽章是:

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

最後步驟是建立 Authorization 標頭。對於示範存取金鑰 AKIAIOSFODNN7EXAMPLE,標頭 (為了可讀性而新增了換行) 是:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

計算串流操作的簽章

上傳封存 (POST 封存)分段上傳 (PUT uploadID) 是串流操作,需要您在簽章和發送請求時包含附加標頭 x-amz-content-sha256。串流操作的簽章步驟與其他操作的簽章步驟完全相同,但增加了串流標頭。

串流標頭 x-amz-content-sha256 的計算是依據要上傳的整個內容 (承載) 的 SHA256 雜湊。請注意,這個計算不同於 SHA256 樹狀雜湊 (運算檢查總和)。除了微不足道的情況外,承載資料的 SHA 256 雜湊值將與承載資料的 SHA256 樹狀雜湊不同。

如果承載資料指定為位元組陣列,則可以使用以下 Java 程式碼片段來運算 SHA256 雜湊。

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

同樣地,在 C# ,您可以計算承載資料的 SHA256 雜湊,如以下的程式碼片段所示。

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

串流 API 的簽章計算範例

以下範例會逐步解說為 上傳封存 (POST 封存) 建立簽章的詳細資訊,這是 S3 Glacier 中兩個串流 API 的其中之一。該範例假設如下:

  • 請求的時間戳記為 Mon, 07 May 2012 00:00:00 GMT

  • 端點是美國東部 (維吉尼亞北部) 區域 (us-east-1)。

  • 內容承載是「歡迎使用 S3 Glacier」的字串。

下面的範例顯示一般請求語法 (包括 JSON 內文)。請注意,包含 x-amz-content-sha256 標頭。在這個簡化的範例中,x-amz-sha256-tree-hashx-amz-content-sha256 是相同的值。但是,對於大於 1 MB 的封存上傳,情況並非如此。

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

對於任務 1:建立正式請求 計算的請求的正式形式如下所示。請注意,串流標頭 x-amz-content-sha256 包含其值。這表示您必須先讀取承載和計算 SHA256 雜湊,然後再計算簽章。

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

剩餘的簽章計算遵循 簽章計算範例 中概述的步驟。使用私密存取金鑰Authorization 和存取金鑰 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYAKIAIOSFODNN7EXAMPLE 標頭如下所示 (為了可讀性而增加了換行):

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6