

# AWS API 请求签名的元素
<a name="reference_sigv-signing-elements"></a>

**重要**  
除非您使用 AWS SDK 或 CLI，否则您必须编写代码来计算在请求中提供身份验证信息的签名。AWS 签名版本 4 中的签名计算可能是一项复杂的任务，我们建议您尽可能使用 AWS SDK 或 CLI。

每个使用 Signature Version 4 签名的 HTTP/HTTPS 请求都必须包含这些元素。

**Topics**
+ [终端节点规范](#endpoint-specification)
+ [Action](#action)
+ [操作参数](#parameters)
+ [日期](#date)
+ [身份验证信息](#authentication)

## 终端节点规范
<a name="endpoint-specification"></a>

指定您要向其发送请求的端点的 DNS 名称。此名称通常包含服务代码和区域。例如，`us-east-1` 区域的 Amazon DynamoDB 端点为 `dynamodb.us-east-1.amazonaws.com`。

对于 HTTP/1.1 请求，您必须使用 `Host` 标头。对于 HTTP/2 请求，您可以使用 `:authority` 标头或 `Host` 标头。仅使用 `:authority` 标头以符合 HTTP/2 规范。并非所有服务都支持 HTTP/2 请求。

有关每项服务支持的端点，请参阅《AWS 一般参考》中的 [服务端点和限额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)**。

## Action
<a name="action"></a>

为服务指定 API 操作。例如，DynamoDB `CreateTable` 操作或 Amazon EC2 `DescribeInstances` 操作。

有关每项服务支持的操作，请参阅 [服务授权参考](https://docs.aws.amazon.com//service-authorization/latest/reference/reference.html)。

## 操作参数
<a name="parameters"></a>

指定请求中指定的操作的参数。每个 AWS API 操作都有一组必备参数和可选参数。API 版本通常是必需参数。

有关 API 操作支持的参数，请参阅服务的 API 参考。

## 日期
<a name="date"></a>

指定请求的日期和时间。在请求中包括日期和时间有助于防止第三方拦截您的请求并稍后重新提交。您在凭证范围中指定的日期必须与您请求的日期匹配。

时间戳必须采用 UTC 表示，并具有以下 ISO 8601 格式：*YYYYMMDD*T*HHMMSS*Z。例如 `20220830T123600Z`。请勿在时间戳中包含毫秒。

您可以使用 `date` 标头或 `x-amz-date` 标头，或将 `x-amz-date` 作为查询参数包含在内。如果无法找到 `x-amz-date` 标头，则需要查找 `date` 标头。

## 身份验证信息
<a name="authentication"></a>

您发送的每个请求都必须包含以下信息。AWS 使用这些信息来确保请求的有效性和真实性。
+ 算法 – 您在签名过程中使用的算法。
  + SigV4 – 使用 `AWS4-HMAC-SHA256` 对 `HMAC-SHA256` 哈希算法指定 Signature Version 4。
  + SigV4a – 使用 `AWS4-ECDSA-P256-SHA256` 指定 `ECDSA-P256-SHA-256` 哈希算法。
+ 凭证 – 通过将您的访问密钥 ID 和凭证范围组件串联起来而形成的字符串。
  + SigV4 – 凭证范围包括访问密钥 ID、*YYYYMMDD* 格式的日期、区域代码、服务代码和 `aws4_request` 终止字符串，用斜杠（/）分隔。区域代码、服务代码和终止字符串必须使用小写字符。

    ```
    AKIAIOSFODNN7EXAMPLE/YYYYMMDD/region/service/aws4_request
    ```
  + SigV4a – 凭证范围包括 YYYYMMDD 格式的日期、服务名称和 `aws4_request` 终止字符串，用斜杠（/）分隔。请注意，凭证范围不包括区域，因为该区域包含在单独的标头 `X-Amz-Region-Set` 中。

    ```
    AKIAIOSFODNN7EXAMPLE/YYYYMMDD/service/aws4_request
    ```
+ 已签名标头 – 签名中要包含的 HTTP 标头，用分号（;）分隔。例如 `host;x-amz-date`。

  对于 SigV4a，您必须包含一个区域集标头，该标头指定请求将在哪一组区域中生效。标头 `X-Amz-Region-Set` 被指定为逗号分隔值的列表。下面的示例显示一个区域标头，该标头允许在 us-east-1 和 us-west-1 区域中进行请求。

  ```
  X-Amz-Region-Set=us-east-1,us-west-1
  ```

  您可以在区域中使用通配符（\$1）来指定多个区域。在下面的示例中，标头允许在 us-west-1 和 us-west-2 中进行请求。

  ```
  X-Amz-Region-Set=us-west-*
  ```
+ 签名 – 代表计算得到的签名的十六进制编码字符串。您必须使用您在 `Algorithm` 参数中指定的算法来计算签名。

有关更多信息，请参阅 [身份验证方法](reference_sigv-authentication-methods.md)。