本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS API請求的簽名版本 4
重要
如果您使用 AWS SDK (請參閱範例程式碼和程式庫
在支援多個簽名版本的區域中,手動簽署要求表示您必須指定要使用的簽名版本。當您向「多區域存取點」提供請求時,SDKsCLI會自動切換到使用「簽名版本 4A」,而無需額外設定。
您在要求中傳送的驗證資訊必須包含簽章。 AWS 簽章版本 4 (SIGv4) 是用於將驗證資訊新增至 AWS API要求的 AWS 簽署通訊協定。
您不會使用私密存取金鑰來簽署API要求。而是使用 Sigv4 簽署程序。簽署要求包括:
-
根據請求詳細信息創建規範請求。
-
使用您的 AWS 認證計算簽名。
-
將此簽名作為授權標頭添加到請求中。
AWS 然後複製此過程並驗證簽名,相應地授予或拒絕訪問權限。
注意
AWS 還支持簽名版本 4A 的擴展,該擴展支持多地區API請求的簽名。如需詳細資訊,請參閱上 GitHub的 sigv4 a-signing-examples
如何 AWS 運作
下圖說明計算簽名的一般過程:
![簽章部分的影像,包括要簽署的字串、簽署金鑰和計算的簽章。](images/signing-overview.png)
-
要簽署的字串取決於請求類型。例如,當您使用HTTP授權標頭或查詢參數進行驗證時,您可以使用 request 元素的組合來建立要簽署的字串。對於HTTPPOST請求,請求中的
POST
策略是您簽署的字符串。 -
簽名密鑰是一系列計算,每個步驟的結果輸入到下一步。最後的步驟是簽署金鑰。
-
當 AWS 服務收到已驗證的要求時,會使用要求中包含的驗證資訊重新建立簽章。如果簽章相符,則服務會處理請求。否則,它會拒絕請求。
如需詳細資訊,請參閱AWS API請求簽名的元素。
簽署請求的時機
當您撰寫傳送API要求的自訂程式碼時 AWS,必須包含簽署要求的程式碼。您可能會因為以下原因編寫自訂程式碼:
-
您正在使用一種沒有的編程語言 AWS SDK。
-
您需要完全控制要求傳送至的方式 AWS。
當API請求驗證訪問與 AWS Sigv4, AWS SDKs並通過使用您提供的訪問密鑰 AWS CLI 驗證您的請求。如需使用 AWS SDKs和進行驗證的詳細資訊 AWS CLI,請參閱其他資源。
為什麼要簽署請求
簽署程序有助於以下列方式保護請求的安全:
-
驗證請求者的身分
經過驗證的請求需要您使用存取金鑰 (存取金鑰 ID、私密存取金鑰) 建立的簽章。如果您使用暫時安全憑證,則簽章計算還需要安全字符。如需詳細資訊,請參閱 AWS 安全憑證程式設計存取權。
-
保護傳輸中的資料
為了防止傳送中的請求遭到竄改,有些請求元素可用來計算請求的雜湊 (摘要),而產生的雜湊值會包含在請求中。當 AWS 服務 收到請求時,它會使用相同的信息來計算散列並將其與請求中的哈希值進行匹配。如果值不匹配,則 AWS 拒絕請求。
-
抵禦潛在重播攻擊的侵害
在大多數情況下,請求必須在請求中的時間戳記的五分鐘 AWS 內到達。否則, AWS 拒絕請求。
AWS Sigv4 可以在HTTP授權標頭中表示,也可以表示為中的查詢字串。URL如需詳細資訊,請參閱身分驗證方法。
其他資源
-
如需不同服務之 Sigv4 簽署程序的詳細資訊,請參閱請求簽章範例。
-
若要設定以程式設計方式存取的認證 AWS CLI,請參閱《AWS 命令列介面使用者指南》中的驗證和存取身分證明。
-
AWS SDKs包含簽署 AWS API要求的 GitHub 原始程式碼。如需程式碼範例,請參閱範例儲存庫中的 AWS 範例專案。
-
AWS SDK for .NET — AWS4Signer.
-
AWS SDK for C++ — AWSAuthV4Signer. CPP
-
AWS SDK for Go — v4.go
-
AWS SDK for Java — BaseAws4Signer.java
-
AWS SDK for JavaScript — v4.js
-
AWS SDK for PHP — SignatureV4.php
-
AWS SDK for Python (Boto) — signers.py
-
AWS SDK for Ruby — 簽名者
-