簽署請求 - Amazon S3 Glacier

此頁面僅適用於使用 Vault 和 REST API 2012 年原始版本的 S3 Glacier 服務的現有客戶。

如果您要尋找封存儲存解決方案,建議您在 Amazon S3、S3 Glacier S3 Instant RetrievalS3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 中使用 S3 Glacier 儲存類別。若要進一步了解這些儲存選項,請參閱 Amazon S3 使用者指南 中的使用 S3 Glacier 儲存類別的 S3 Glacier 儲存類別和長期資料儲存Amazon S3 這些儲存類別使用 Amazon S3 API,適用於所有區域,並且可以在 Amazon S3 主控台中管理。它們提供 Storage Cost Analysis、Storage Lens、進階選用加密功能等功能。

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

簽署請求

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

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

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

  • 任務 1:建立正式請求

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

  • 任務 2:建立登入字串

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

  • 任務 3:建立簽章

    使用接受兩個輸入字串的密碼編譯雜湊函數來建立請求的簽章:您的 登入字串衍生金鑰衍生金鑰的計算方式是從您的秘密存取金鑰開始,並使用認證範圍字串建立一系列雜湊型訊息驗證碼 (HMACs)。請注意,此簽署步驟中使用的雜湊函數不是 S3 Glacier APIs 中上傳資料的樹雜湊演算法。

簽章計算範例

以下範例會逐步解說為 建立文件庫 (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 中兩個串流的其APIs中一個。該範例假設如下:

  • 請求的時間戳記為 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