

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

# AWS API 請求的簽章版本 4
<a name="reference_sigv"></a>

**重要**  
如果您使用 AWS SDK （請參閱[範例程式碼和程式庫](https://aws.amazon.com/developer/)) 或 AWS Command Line Interface (AWS CLI) 工具來傳送 API 請求 AWS，您可以略過簽章程序，因為 SDK 和 CLI 用戶端會使用您提供的存取金鑰來驗證您的請求。除非有充分的理由不這樣做，否則建議您始終使用 SDK 或 CLI。  
在支援多個簽章版本的區域中，手動簽署要求意味著您必須指定要使用的簽章版本。當您向多區域存取點提供請求時，SDK 和 CLI 會自動切換為使用第 4A 版簽署程序，而不需其他組態。

您在請求中傳送的身分驗證資訊必須包含簽章。 AWS Signature 第 4 版 (SigV4) 是將身分驗證資訊新增至 AWS API 請求的 AWS 簽署通訊協定。

您不會使用私密存取金鑰來簽署請求。相反，您使用 SigV4 簽署程序。簽署請求涉及：

1. 根據請求詳細資訊來建立正式請求。

1. 使用您的 AWS 登入資料計算簽章。

1. 將此簽章作為授權標頭新增至請求。

AWS 然後， 會複寫此程序，並驗證簽章、授予或拒絕相應存取。

對稱 SigV4 要求您在特定日期，在特定 AWS 區域中衍生範圍限定為單一 AWS 服務的金鑰。這使得每個區域的金鑰和計算簽章不同，意味著您必須知道簽章的目的地區域。

非對稱簽章程序第 4 版 (SigV4a) 是支援使用新演算法進行簽署的延伸版，並產生可在多個 AWS 區域中驗證的個別簽章。使用 SigV4a，您可以簽署多個區域的請求，並在區域之間進行無縫路由和容錯移轉。當您使用 AWS SDK 或 AWS CLI 叫用需要多區域簽署的功能時，簽章類型會自動變更為使用 SigV4a。如需詳細資訊，請參閱[如何運作 AWS SigV4a](#how-sigv4a-works)。

## How AWS SigV4 運作方式
<a name="how-aws-signing-works"></a>

下列步驟說明使用 SigV4 來計算簽章的一般程序：

1. **要簽署的字串**取決於請求類型。例如，當您使用 HTTP 授權標頭或查詢參數進行驗證時，請使用請求元素組合來建立要簽署的字串。對於 HTTP POST 請求，請求中的 `POST` 政策是您簽署的字串。

1. **簽署金鑰**是一系列計算，每個步驟的結果會饋送至下一個步驟。最後的步驟是簽署金鑰。

1. 當 AWS 服務收到已驗證的請求時，它會使用請求中包含的身分驗證資訊重新建立**簽章**。如果簽章相符，則服務會處理請求。否則，它會拒絕請求。

如需詳細資訊，請參閱[AWS API 請求簽章的元素](reference_sigv-signing-elements.md)。

## 如何運作 AWS SigV4a
<a name="how-sigv4a-works"></a>

SigV4a 使用基於公有/私有金鑰密碼的非對稱簽章。SigV4a 會經歷與 SigV4 類似的範圍憑證衍生程序，但 SigV4a 使用相同的金鑰來簽署所有請求，而不需要根據日期、服務和區域衍生不同的簽署金鑰。[橢圓曲線數位簽章演算法](https://csrc.nist.gov/glossary/term/ecdsa) (ECDSA) 金鑰對可以從您現有的 AWS 私密存取金鑰衍生。

系統使用非對稱密碼編譯來驗證多區域簽章，因此 AWS 僅需要存放您的公有金鑰。公有金鑰不是秘密，無法用於簽署請求。多區域 API 請求需要非對稱簽章，例如使用 Amazon S3 多區域存取點。

下列步驟說明使用 SigV4a 運算簽章的一般程序：

1. **要簽署的字串**取決於請求類型。例如，當您使用 HTTP 授權標頭或查詢參數進行驗證時，請使用請求元素組合來建立要簽署的字串。對於 HTTP POST 請求，請求中的 `POST` 政策是您簽署的字串。

1. **簽署金鑰**是透過一系列計算衍生自 AWS 私密存取金鑰，每個步驟的結果會饋送至下一個步驟。最後一個步驟會產生金鑰對。

1. 當 AWS 服務收到使用 SigV4a 簽署的請求時， 只會使用金鑰對的公有半部來 AWS 驗證簽章。如果簽章有效，則會驗證請求，並且服務會處理請求。具有無效簽章的請求會遭到拒絕。

如需有關多區域 API 請求的 SigV4a 詳細資訊，請參閱 GitHub 上的 [sigv4a-signing-examples](https://github.com/aws-samples/sigv4a-signing-examples) 專案。

## 簽署請求的時機
<a name="when-do-you-need-to-sign"></a>

當您編寫傳送 API 請求的自訂程式碼時 AWS，必須包含簽署請求的程式碼。您可能會因為以下原因編寫自訂程式碼：
+ 您使用的程式設計語言沒有 AWS 軟體開發套件。
+ 您需要完全控制請求的傳送方式 AWS。

當 API 請求使用 AWS SigV4 來驗證存取時 AWS CLI ， AWS SDKs會使用您提供的存取金鑰來驗證您的請求。如需使用 AWS SDKs和 驗證 的詳細資訊 AWS CLI，請參閱 [其他資源](#reference_aws-signing-resources)。

## 為什麼要簽署請求
<a name="why-requests-are-signed"></a>

簽署程序有助於以下列方式保護請求的安全：
+ **驗證請求者的身分**

  經過驗證的請求需要您使用存取金鑰 (存取金鑰 ID、私密存取金鑰) 建立的簽章。如果您使用暫時安全憑證，則簽章計算還需要安全字符。如需詳細資訊，請參閱 [AWS 安全憑證程式設計存取權](security-creds-programmatic-access.md)。
+ **保護傳輸中的資料**

  為了防止傳送中的請求遭到竄改，有些請求元素可用來計算請求的雜湊 (摘要)，而產生的雜湊值會包含在請求中。當 AWS 服務 收到請求時，它會使用相同的資訊來計算雜湊，並將其與請求中的雜湊值相符。如果值不相符， 會 AWS 拒絕請求。
+ **抵禦潛在重播攻擊的侵害**

  在大多數情況下，請求必須在請求中時間戳記的五分鐘 AWS 內到達。否則， 會 AWS 拒絕請求。

AWS SigV4 可以在 HTTP 授權標頭中表示，或在 URL 中表示為查詢字串。如需詳細資訊，請參閱[身分驗證方法](reference_sigv-authentication-methods.md)。

## 其他資源
<a name="reference_aws-signing-resources"></a>
+ 如需不同服務的 SigV4 簽署程序的詳細資訊，請參閱 [請求簽章範例](reference_sigv-examples.md)。
+ 若要設定 CLI AWS 的程式設計存取憑證，請參閱《 *AWS 命令列界面使用者指南*》中的[身分驗證和存取憑證](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)。
+ 此 AWS SDKs包含 GitHub 上用於簽署 AWS API 請求的原始碼。如需程式碼範例，請參閱 [AWS 範例儲存庫中的範例專案](reference_sigv-examples.md#signature-v4-examples-sdk)。
  + 適用於 .NET 的 AWS SDK – [AWS4Signer.cs](https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs)
  + 適用於 C\+\+ 的 AWS SDK – [AWSAuthV4Signer.cpp](https://github.com/aws/aws-sdk-cpp/blob/main/src/aws-cpp-sdk-core/source/auth/signer/AWSAuthV4Signer.cpp)
  + 適用於 Go 的 AWS SDK – [sigv4.go](https://github.com/aws/smithy-go/blob/a4c9efcda6aa54c75d1a130d1320a2709eebf51d/aws-http-auth/sigv4/sigv4.go)
  + 適用於 Java 的 AWS SDK – [BaseAws4Signer.java](https://github.com/aws/aws-sdk-java-v2/blob/master/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseAws4Signer.java)
  + 適用於 JavaScript 的 AWS SDK – [signature-v4](https://github.com/smithy-lang/smithy-typescript/tree/main/packages/signature-v4)
  + 適用於 PHP 的 AWS SDK – [SignatureV4.php](https://github.com/aws/aws-sdk-php/blob/master/src/Signature/SignatureV4.php)
  + 適用於 Python (Boto) 的 AWS SDK – https：//[signers.py](https://github.com/boto/botocore/blob/develop/botocore/signers.py)
  + 適用於 Ruby 的 AWS SDK – [signer.rb](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sigv4/lib/aws-sigv4/signer.rb)