

# 在请求身份验证中指定签名版本
<a name="specify-signature-version"></a>

 Amazon S3 在大多数 AWS 区域 中只支持 AWS Signature Version 4。不过，在某些较旧的 AWS 区域 中，Amazon S3 同时支持 Signature Version 4 和 Signature Version 2。但是，签名版本 2 将要被关闭（弃用）。有关结束对签名版本 2 支持的更多信息，请参阅 [已为 Amazon S3 关闭（弃用）AWS 签名版本 2](#UsingAWSSDK-sig2-deprecation)。

有关所有 Amazon S3 区域的列表以及这些区域支持的 Signature Version，请参阅《*AWS 一般参考*》中的[区域和终端节点](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region)。

对于所有 AWS 区域，默认情况下，AWS 开发工具包使用 Signature Version 4 对请求进行身份验证。如果使用 2016 年 5 月之前发布的 AWS 开发工具包，您可能需要请求 Signature Version 4，如下表所示。


| 开发工具包 | 请求使用签名版本 4 进行请求身份验证 | 
| --- | --- | 
| AWS CLI | 对于默认配置文件，运行以下命令：<pre>$ aws configure set default.s3.signature_version s3v4</pre><br />对于自定义配置文件，运行以下命令：<pre>$ aws configure set profile.your_profile_name.s3.signature_version s3v4</pre> | 
| Java 软件开发工具包 | 在代码中添加以下内容：<pre>System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");</pre><br />或者在命令行中指定以下内容：<pre>-Dcom.amazonaws.services.s3.enableV4</pre> | 
|  JavaScript 开发工具包 | 在构建客户端时，将 `signatureVersion` 参数设置为 `v4`：<pre>var s3 = new AWS.S3({signatureVersion: 'v4'});</pre> | 
| PHP 开发工具包 | 在为 PHP 开发工具包 v2 构建 Amazon S3 服务客户端时，将 `signature` 参数设置为 `v4`：<pre><?php <br />$client = S3Client::factory([<br />    'region' => 'YOUR-REGION',<br />    'version' => 'latest',<br />    'signature' => 'v4'<br />]);</pre><br />使用 PHP 开发工具包 v3 时，在构建 Amazon S3 服务客户端期间将 `signature_version` 参数设置为 `v4`：<pre><?php <br />$s3 = new Aws\S3\S3Client([<br />    'version' => '2006-03-01',<br />    'region' => 'YOUR-REGION',<br />    'signature_version' => 'v4'<br />]);</pre> | 
| Python-Boto 开发工具包 | 在默认配置文件 boto 中指定以下内容：<pre>[s3] use-sigv4 = True</pre> | 
| Ruby 开发工具包 | Ruby 开发工具包 – 版本 1：在构建客户端时，将 `:s3_signature_version` 参数设置为 `:v4`：<pre>s3 = AWS::S3::Client.new(:s3_signature_version => :v4)</pre><br />Ruby 开发工具包 – 版本 3：在构建客户端时，将 `signature_version` 参数设置为 `v4`：<pre>s3 = Aws::S3::Client.new(signature_version: 'v4')</pre> | 
| .NET 开发工具包 | 在创建 Amazon S3 客户端之前将以下内容添加到代码中：<pre>AWSConfigsS3.UseSignatureVersion4 = true;</pre><br />或将以下内容添加到配置文件中：<pre><appSettings><br />   <add key="AWS.S3.UseSignatureVersion4" value="true" /><br /></appSettings></pre> | 

 

## 已为 Amazon S3 关闭（弃用）AWS 签名版本 2
<a name="UsingAWSSDK-sig2-deprecation"></a>

但是，Amazon S3 即将关闭（弃用）签名版本 2。之后，Amazon S3 仅接受使用签名版本 4 签名的 API 请求。

本部分提供有关结束签名版本 2 支持的常见问题解答。

**什么是签名版本 2/4，以及这对于签名请求意味着什么？**  
签名版本 2 或签名版本 4 签名过程用于对 Amazon S3 API 请求进行身份验证。签名请求使得 Amazon S3 可以确定谁在发送请求并保护您的请求免遭恶意人士侵害。

有关签署 AWS 请求的更多信息，请参阅《AWS 一般参考》**中的[签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

**进行了哪些更新？**  
我们当前支持使用签名版本 2 和签名版本 4 过程签名的 Amazon S3 API 请求。在此之后，Amazon S3 将仅接受使用签名版本 4 签名的请求。

有关签署 AWS 请求的更多信息，请参阅《AWS 一般参考》**中的[签名版本 4 中的变化](https://docs.aws.amazon.com/general/latest/gr/sigv4_changes.html)。

**为什么进行这些更新？**  
签名版本 4 使用签名密钥而非您的秘密访问密钥，提供了更好的安全性。当前所有 AWS 区域中都支持 Signature Version 4，而只有在 2014 年 1 月之前推出的区域中支持 Signature Version 2。此更新使得我们可以在所有区域中提供更为一致的体验。

**如何确保我使用的是签名版本 4，需要进行哪些更新？**  
对请求进行签名所用的签名版本通常由客户端上的工具或开发工具包设置。默认情况下，AWS 开发工具包的最新版本使用 Signature Version 4。对于第三方软件，请联系您软件的相应支持团队以确认所需的版本。如果您向 Amazon S3 发送直接 REST 调用，则必须修改应用程序以使用签名版本 4 签名过程。

有关在转向 Signature Version 4 时所用 AWS 开发工具包版本的信息，请参阅 [从签名版本 2 转向签名版本 4](#UsingAWSSDK-move-to-Sig4)。

有关将 Signature Version 4 与 Amazon S3 REST API 结合使用的信息，请参阅《*Amazon Simple Storage Service API 参考*》中的[对请求进行身份验证 (AWS Signature Version 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)。

**如果我不更新会怎样？**  
在此之后使用签名版本 2 签名的请求将无法通过 Amazon S3 的身份验证。请求者将看到错误，说明请求必须使用签名版本 4 签名。

**如果我使用要求我签名 7 天以上的预签名 URL，是否应进行更改？**  
如果您使用了要求您签名 7 天以上的预签名 URL，目前无需任何操作。您可以继续使用 AWS Signature Version 2 对预签名 URL 进行签名并通过身份验证。我们将后续跟进并提供更多详情，说明如何为预签名 URL 场景迁移签名版本 4。

### 更多信息
<a name="UsingAWSSDK-sev2-deprecation-more-info"></a>
+ 有关使用 Signature Version 4 的更多信息，请参阅[签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。
+ 在[签名版本 4 中的变化](https://docs.aws.amazon.com/general/latest/gr/sigv4_changes.html)中可查看签名版本 2 与签名版本 4 之间的改动列表。
+ 查看 AWS 论坛中的帖子：[AWS Signature Version 4 将取代 AWS Signature Version 2 用于签署 Amazon S3 API 请求](https://forums.aws.amazon.com/ann.jspa?annID=5816)。
+ 如果您有任何问题或疑虑，请联系 [支持](https://docs.aws.amazon.com/awssupport/latest/user/getting-started.html)。

   

## 从签名版本 2 转向签名版本 4
<a name="UsingAWSSDK-move-to-Sig4"></a>

如果您为 Amazon S3 API 请求身份验证使用签名版本 2，则应改为使用签名版本 4。对签名版本 2 的支持将结束，如[已为 Amazon S3 关闭（弃用）AWS 签名版本 2](#UsingAWSSDK-sig2-deprecation)中所述。

有关将 Signature Version 4 与 Amazon S3 REST API 结合使用的信息，请参阅《*Amazon Simple Storage Service API 参考*》中的[对请求进行身份验证 (AWS Signature Version 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)。

下表列出了使用签名版本 4 (SigV4) 所需的开发工具包最低版本列表。如果您使用通过 AWS Java、JavaScript (Node.js) 或 Python (Boto/CLI)开发工具包预签名 URL，则必须设置正确的 AWS 区域 并在客户端配置中设置 Signature Version 4。有关在客户端配置中设置 `SigV4` 的信息，请参阅[在请求身份验证中指定签名版本](#specify-signature-version)。


| 如果您使用此开发工具包/产品 | 请升级至此开发工具包版本 | 客户端是否需要进行代码更改以使用 Sigv4？ | 指向开发工具包文档的链接 | 
| --- | --- | --- | --- | 
| 适用于 Java 的 AWS SDK v1 | 升级至 Java 1.11.201\+ 或 v2。 | 是 | [在请求身份验证中指定签名版本](#specify-signature-version) | 
| 适用于 Java 的 AWS SDK v2 | 无需开发工具包升级。 | 否 | [适用于 Java 的 AWS SDK](https://aws.amazon.com/sdk-for-java/) | 
| 适用于 .NET 的 AWS SDK v1  | 升级至 3.1.10 或更高版本。 | 是 | [适用于 .NET 的 AWS SDK](https://github.com/aws/aws-sdk-net/tree/aws-sdk-net-v1/) | 
| 适用于 .NET 的 AWS SDK v2  | 升级至 3.1.10 或更高版本。 | 否 | [适用于 .NET 的 AWS SDK v2](https://github.com/aws/aws-sdk-net/tree/aws-sdk-net-v2/) | 
| 适用于 .NET 的 AWS SDK v3  | 升级至 3.3.0.0 或更高版本。 | 是 | [适用于 .NET 的 AWS SDK v3](https://github.com/aws/aws-sdk-net) | 
| 适用于 JavaScript 的 AWS SDK v1  | 升级至 2.68.0 或更高版本。 | 是 | [适用于 JavaScript 的 AWS SDK](https://github.com/aws/aws-sdk-js) | 
| 适用于 JavaScript 的 AWS SDK v2  | 升级至 2.68.0 或更高版本。 | 是 | [适用于 JavaScript 的 AWS SDK](https://github.com/aws/aws-sdk-js) | 
| 适用于 JavaScript 的 AWS SDK v3  | 当前无需任何操作。2019 年 3 季度升级至主要版本 V3。 | 否 | [适用于 JavaScript 的 AWS SDK](https://github.com/aws/aws-sdk-js) | 
| 适用于 PHP 的 AWS SDK v1  | 建议升级至最新版本的 PHP，或者至少升级至已在 S3 客户端的配置中将签名参数设置为 v4 的 v2.7.4。 | 是 | [适用于 PHP 的 AWS SDK](https://aws.amazon.com/sdk-for-php/) | 
| 适用于 PHP 的 AWS SDK v2  | 建议升级至最新版本的 PHP，或者至少升级至已在 S3 客户端的配置中将签名参数设置为 v4 的 v2.7.4。 | 否 | [适用于 PHP 的 AWS SDK](https://aws.amazon.com/sdk-for-php/) | 
| 适用于 PHP 的 AWS SDK v3  | 无需开发工具包升级。 | 否 | [适用于 PHP 的 AWS SDK](https://aws.amazon.com/sdk-for-php/) | 
| Boto2  | 升级至 Boto2 v2.49.0。 | 是 | [Boto 2 升级](https://github.com/boto/boto/commit/16729da27b95d6dbbd81bcebb43bcf099ce23fd3) | 
| Boto3  | 升级至 1.5.71 (Botocore)、1.4.6 (Boto3)。 | 是 | [Boto 3 – 适用于 Python 的 AWS 开发工具包](https://github.com/boto/boto3) | 
| AWS CLI  | 升级至 1.11.108。 | 是 | [AWS Command Line Interface](https://aws.amazon.com/cli/) | 
| AWS CLI v2（预览）  | 无需开发工具包升级。 | 否 | [AWS Command Line Interface 版本 2](https://github.com/aws/aws-cli/tree/v2) | 
| 适用于 Ruby 的 AWS SDK v1  | 升级至 Ruby V3。 | 是 | [ 的 Ruby V3AWS](https://rubygems.org/gems/aws-sdk/versions) | 
| 适用于 Ruby 的 AWS SDK v2  | 升级至 Ruby V3。 | 是 | [ 的 Ruby V3AWS](https://rubygems.org/gems/aws-sdk/versions) | 
| 适用于 Ruby 的 AWS SDK v3  | 无需开发工具包升级。 | 否 | [ 的 Ruby V3AWS](https://rubygems.org/gems/aws-sdk/versions) | 
| Go  | 无需开发工具包升级。 | 否 | [适用于 Go 的 AWS SDK](https://aws.amazon.com/sdk-for-go/) | 
| C\+\+  | 无需开发工具包升级。 | 否 | [适用于 C\+\+ 的 AWS SDK](https://aws.amazon.com/sdk-for-cpp/) | 

**AWS Tools for Windows PowerShell 或者 AWS Tools for PowerShell Core**  
如果您使用的模块版本*早于* 3.3.0.0，则必须升级到 3.3.0.0。

要获取版本信息，请使用 `Get-Module` cmdlet：

```
          Get-Module –Name AWSPowershell
          Get-Module –Name AWSPowershell.NetCore
```



要更新 3.3.0.0 版本，请使用 `Update-Module` cmdlet：

```
          Update-Module –Name AWSPowershell
          Update-Module –Name AWSPowershell.NetCore
```

您可以使用有效期超过 7 天的预签名 URL 以将签名版本 2 流量发送到其上。