

 适用于 .NET 的 AWS SDK V3 已进入维护模式。

我们建议您迁移到 [适用于 .NET 的 AWS SDK V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html)。有关如何迁移的更多详细信息和信息，请参阅我们的[维护模式公告](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 本 AWS 产品或服务的安全性
<a name="security"></a>

云安全性一直是 Amazon Web Services（AWS）的重中之重。作为 AWS 客户，您将从专为满足大多数安全敏感型企业的要求而打造的数据中心和网络架构中受益。安全是双方 AWS 的共同责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云的安全性和云中的安全性。

**云安全** — AWS 负责保护运行 AWS 云中提供的所有服务的基础架构，并为您提供可以安全使用的服务。我们的安全责任是重中之重 AWS，作为[AWS 合规计划](https://aws.amazon.com/compliance/programs/)的一部分，第三方审计师定期测试和验证我们安全的有效性。

**云端安全** — 您的责任由您使用的 AWS 服务以及其他因素决定，包括数据的敏感性、组织的要求以及适用的法律和法规。

本 AWS 产品或服务通过其支持的特定 Amazon Web Services (AWS) 服务遵循[分担责任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。有关 AWS 服务安全信息，请参阅[AWS 服务安全文档页面](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)和合规[计划合 AWS 规工作范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。

**Topics**
+ [数据保护](data-protection.md)
+ [身份和访问管理](security-iam.md)
+ [合规性验证](compliance-validation.md)
+ [恢复能力](disaster-recovery-resiliency.md)
+ [基础设施安全性](infrastructure-security.md)
+ [强制实施最低 TLS 版本](enforcing-tls.md)
+ [S3 加密客户端迁移（从 V1 到 V2）](s3-encryption-migration-v1-v2.md)
+ [S3 加密客户端迁移（从 V2 到 V4）](s3-encryption-migration-v2-v4.md)

# 本 AWS 产品或服务中的数据保护
<a name="data-protection"></a>

分 AWS [担责任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于本 AWS 产品或服务中的数据保护。如本模型所述 AWS ，负责保护运行所有内容的全球基础架构 AWS 云。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

出于数据保护目的，我们建议您保护 AWS 账户 凭证并使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 设置个人用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 用于 SSL/TLS 与 AWS 资源通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用设置 API 和用户活动日志 AWS CloudTrail。有关使用 CloudTrail 跟踪捕获 AWS 活动的信息，请参阅《*AWS CloudTrail 用户指南》*中的[使用跟 CloudTrail 踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解决方案以及其中的所有默认安全控件 AWS 服务。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果您在 AWS 通过命令行界面或 API 进行访问时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅《美国联邦信息处理标准（FIPS）第 140-3 版》[https://aws.amazon.com/compliance/fips/](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括您使用控制台、API 或 AWS 服务 使用本 AWS 产品或服务或其他产品或服务时 AWS SDKs。 AWS CLI在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供 URL，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

# 身份和访问管理
<a name="security-iam"></a>

AWS Identity and Access Management (IAM) AWS 服务 可帮助管理员安全地控制对 AWS 资源的访问权限。IAM 管理员控制谁可以*进行身份验证*（登录）和*授权*（拥有权限）使用 AWS 资源。您可以使用 IAM AWS 服务 ，无需支付额外费用。

**Topics**
+ [受众](#security_iam_audience)
+ [使用身份进行身份验证](#security_iam_authentication)
+ [使用策略管理访问](#security_iam_access-manage)
+ [如何 AWS 服务 使用 IAM](#security_iam_service-with-iam)
+ [对 AWS 身份和访问进行故障排除](#security_iam_troubleshoot)

## 受众
<a name="security_iam_audience"></a>

您的使用方式 AWS Identity and Access Management (IAM) 会有所不同，具体取决于您所做的工作 AWS。

**服务用户**-如果您 AWS 服务 曾经完成工作，则您的管理员会为您提供所需的凭证和权限。当你使用更多 AWS 功能来完成工作时，你可能需要额外的权限。了解如何管理访问权限有助于您向管理员请求适合的权限。如果您无法访问中的功能 AWS，请参阅[对 AWS 身份和访问进行故障排除](#security_iam_troubleshoot)或 AWS 服务 您正在使用的用户指南。

**服务管理员**-如果您负责公司的 AWS 资源，则可能拥有完全访问权限 AWS。您的工作是确定您的服务用户应访问哪些 AWS 功能和资源。然后，您必须向 IAM 管理员提交请求以更改服务用户的权限。请查看该页面上的信息以了解 IAM 的基本概念。要详细了解您的公司如何使用 IAM AWS，请参阅 AWS 服务 您正在使用的用户指南。

**IAM 管理员**：如果您是 IAM 管理员，您可能希望了解如何编写策略以管理对 AWS的访问权限的详细信息。要查看您可以在 IAM 中使用的 AWS 基于身份的策略示例，请参阅 AWS 服务 您正在使用的用户指南。

## 使用身份进行身份验证
<a name="security_iam_authentication"></a>

身份验证是您 AWS 使用身份凭证登录的方式。您必须以 IAM 用户身份进行身份验证 AWS 账户根用户，或者通过担任 IAM 角色进行身份验证。

您可以使用来自身份源的证书 AWS IAM Identity Center （例如（IAM Identity Center）、单点登录身份验证或 Google/Facebook 证书，以联合身份登录。有关登录的更多信息，请参阅《AWS 登录 用户指南》**中的[如何登录您的 AWS 账户](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

对于编程访问， AWS 提供 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 账户 root 用户
<a name="security_iam_authentication-rootuser"></a>

 创建时 AWS 账户，首先会有一个名为 AWS 账户 *root 用户的*登录身份，该身份可以完全访问所有资源 AWS 服务 和资源。我们强烈建议不要使用根用户进行日常任务。有关需要根用户凭证的任务，请参阅《IAM 用户指南》**中的[需要根用户凭证的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 联合身份
<a name="security_iam_authentication-federated"></a>

作为最佳实践，要求人类用户使用与身份提供商的联合身份验证才能 AWS 服务 使用临时证书进行访问。

*联合身份是指*来自您的企业目录、Web 身份提供商的用户 Directory Service ，或者 AWS 服务 使用来自身份源的凭据进行访问的用户。联合身份代入可提供临时凭证的角色。

要集中管理访问权限，建议使用。 AWS IAM Identity Center有关更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[什么是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

### IAM 用户和群组
<a name="security_iam_authentication-iamuser"></a>

*[IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅 *IAM 用户指南*[中的要求人类用户使用身份提供商的联合身份验证才能 AWS 使用临时证书进行访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 AWS CLI 或 AWS API 操作来代入角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问
<a name="security_iam_access-manage"></a>

您可以 AWS 通过创建策略并将其附加到 AWS 身份或资源来控制中的访问权限。策略定义了与身份或资源关联时的权限。 AWS 在委托人提出请求时评估这些政策。大多数策略都以 JSON 文档的 AWS 形式存储在中。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略
<a name="security_iam_access-manage-id-based-policies"></a>

基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略
<a name="security_iam_access-manage-resource-based-policies"></a>

基于资源的策略是附加到资源的 JSON 策略文档。示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。您必须在基于资源的策略中[指定主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

基于资源的策略是位于该服务中的内联策略。您不能在基于资源的策略中使用 IAM 中的 AWS 托管策略。

### 访问控制列表 (ACLs)
<a name="security_iam_access-manage-acl"></a>

访问控制列表 (ACLs) 控制哪些委托人（账户成员、用户或角色）有权访问资源。 ACLs 与基于资源的策略类似，尽管它们不使用 JSON 策略文档格式。

Amazon S3 和 Amazon VPC 就是支持的服务示例 ACLs。 AWS WAF要了解更多信息 ACLs，请参阅《*亚马逊简单存储服务开发者指南*》中的[访问控制列表 (ACL) 概述](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html)。

### 其他策略类型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支持其他策略类型，这些策略类型可以设置更常见的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略 (SCPs)**-在中指定组织或组织单位的最大权限 AWS Organizations。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略 (RCPs)**-设置账户中资源的最大可用权限。有关更多信息，请参阅《*AWS Organizations 用户指南》*中的[资源控制策略 (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型
<a name="security_iam_access-manage-multiple-policies."></a>

当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解在涉及多种策略类型时如何 AWS 确定是否允许请求，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

## 如何 AWS 服务 使用 IAM
<a name="security_iam_service-with-iam"></a>

要全面了解如何 AWS 服务 使用大多数 IAM 功能，请参阅 IAM *用户指南中的与 IAM* [配合使用的AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

要了解如何在 IAM 中 AWS 服务 使用特定的，请参阅相关服务的《用户指南》的安全部分。

## 对 AWS 身份和访问进行故障排除
<a name="security_iam_troubleshoot"></a>

使用以下信息来帮助您诊断和修复在使用 AWS 和 IAM 时可能遇到的常见问题。

**Topics**
+ [我无权在以下位置执行操作 AWS](#security_iam_troubleshoot-no-permissions)
+ [我无权执行 iam：PassRole](#security_iam_troubleshoot-passrole)
+ [我想允许我以外的人 AWS 账户 访问我的 AWS 资源](#security_iam_troubleshoot-cross-account-access)

### 我无权在以下位置执行操作 AWS
<a name="security_iam_troubleshoot-no-permissions"></a>

如果您收到错误提示，指明您无权执行某个操作，则必须更新策略以允许执行该操作。

当 `mateojackson` IAM 用户尝试使用控制台查看有关虚构 `my-example-widget` 资源的详细信息，但不拥有虚构 `awes:GetWidget` 权限时，会发生以下示例错误。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: awes:GetWidget on resource: my-example-widget
```

在此情况下，必须更新 `mateojackson` 用户的策略，以允许使用 `awes:GetWidget` 操作访问 `my-example-widget` 资源。

如果您需要帮助，请联系您的 AWS 管理员。您的管理员是提供登录凭证的人。

### 我无权执行 iam：PassRole
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到一个错误，表明您无权执行 `iam:PassRole` 操作，则必须更新策略以允许您将角色传递给。 AWS

有些 AWS 服务 允许您将现有角色传递给该服务，而不是创建新的服务角色或服务相关角色。为此，您必须具有将角色传递到服务的权限。

当名为 `marymajor` 的 IAM 用户尝试使用控制台在 AWS中执行操作时，会发生以下示例错误。但是，服务必须具有服务角色所授予的权限才可执行此操作。Mary 不具有将角色传递到服务的权限。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在这种情况下，必须更新 Mary 的策略以允许她执行 `iam:PassRole` 操作。

如果您需要帮助，请联系您的 AWS 管理员。您的管理员是提供登录凭证的人。

### 我想允许我以外的人 AWS 账户 访问我的 AWS 资源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以创建一个角色，以便其他账户中的用户或您组织外的人员可以使用该角色来访问您的资源。您可以指定谁值得信赖，可以代入角色。对于支持基于资源的策略或访问控制列表 (ACLs) 的服务，您可以使用这些策略向人们授予访问您的资源的权限。

要了解更多信息，请参阅以下内容：
+ 要了解是否 AWS 支持这些功能，请参阅[如何 AWS 服务 使用 IAM](#security_iam_service-with-iam)。
+ 要了解如何提供对您拥有的资源的访问权限 AWS 账户 ，请参阅 [IAM 用户*指南中的向您拥有 AWS 账户 的另一个 IAM 用户*提供访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)权限。
+ 要了解如何向第三方提供对您的资源的访问[权限 AWS 账户，请参阅 *IAM 用户指南*中的向第三方提供](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)访问权限。 AWS 账户 
+ 要了解如何通过身份联合验证提供访问权限，请参阅《IAM 用户指南》**中的[为经过外部身份验证的用户（身份联合验证）提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 要了解使用角色和基于资源的策略进行跨账户访问之间的差别，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 此 AWS 产品或服务的合规性验证
<a name="compliance-validation"></a>

要了解是否属于特定合规计划的范围，请参阅AWS 服务 “[按合规计划划分的范围](https://aws.amazon.com/compliance/services-in-scope/)” ”，然后选择您感兴趣的合规计划。 AWS 服务 有关一般信息，请参阅[AWS 合规计划AWS](https://aws.amazon.com/compliance/programs/)。

您可以使用下载第三方审计报告 AWS Artifact。有关更多信息，请参阅中的 “[下载报告” 中的 “ AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规责任取决于您的数据的敏感性、贵公司的合规目标以及适用的法律和法规。有关您在使用时的合规责任的更多信息 AWS 服务，请参阅[AWS 安全文档](https://docs.aws.amazon.com/security/)。

本 AWS 产品或服务通过其支持的特定 Amazon Web Services (AWS) 服务遵循[分担责任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。有关 AWS 服务安全信息，请参阅[AWS 服务安全文档页面](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)和合规[计划合 AWS 规工作范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。

# 本 AWS 产品或服务的弹性
<a name="disaster-recovery-resiliency"></a>

 AWS 全球基础设施是围绕 AWS 区域 可用区构建的。

AWS 区域 提供多个物理分隔和隔离的可用区，这些可用区通过低延迟、高吞吐量和高度冗余的网络连接。

利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础设施相比，可用区具有更高的可用性、容错能力和可扩展性。

有关 AWS 区域和可用区的更多信息，请参阅[AWS 全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

本 AWS 产品或服务通过其支持的特定 Amazon Web Services (AWS) 服务遵循[分担责任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。有关 AWS 服务安全信息，请参阅[AWS 服务安全文档页面](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)和合规[计划合 AWS 规工作范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。

# 本 AWS 产品或服务的基础设施安全
<a name="infrastructure-security"></a>

本 AWS 产品或服务使用托管服务，因此受到 AWS 全球网络安全的保护。有关 AWS 安全服务以及如何 AWS 保护基础设施的信息，请参阅[AWS 云安全](https://aws.amazon.com/security/)。要使用基础设施安全的最佳实践来设计您的 AWS 环境，请参阅 S * AWS ecurity Pillar Well-Architected Fram* ework 中的[基础设施保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

您可以使用 AWS 已发布的 API 调用通过网络访问此 AWS 产品或服务。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密（PFS）的密码套件，例如 DHE（临时 Diffie-Hellman）或 ECDHE（临时椭圆曲线 Diffie-Hellman）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

此外，必须使用访问密钥 ID 和与 IAM 主体关联的秘密访问密钥来对请求进行签名。或者，您可以使用 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)（AWS STS）生成临时安全凭证来对请求进行签名。

本 AWS 产品或服务通过其支持的特定 Amazon Web Services (AWS) 服务遵循[分担责任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。有关 AWS 服务安全信息，请参阅[AWS 服务安全文档页面](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)和合规[计划合 AWS 规工作范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。

# 在中强制使用最低 TLS 版本 适用于 .NET 的 AWS SDK
<a name="enforcing-tls"></a>

为了提高与 AWS 服务通信时的安全性，应将配置 适用于 .NET 的 AWS SDK 为使用 TLS 1.2 或更高版本。

 适用于 .NET 的 AWS SDK 使用底层的.NET 运行时来确定要使用哪种安全协议。默认情况下，当前版本的 .NET 使用操作系统支持的最新的已配置协议。您的应用程序可以覆盖此开发工具包行为，但*不建议* 这样做。

## .NET 内核
<a name="enforcing-tls-dotnet-core"></a>

默认情况下，.NET Core 使用操作系统支持的最新的已配置协议。 适用于 .NET 的 AWS SDK 不提供覆盖它的机制。

如果您使用的 .NET Core 版本低于 2.1，我们*强烈* 建议您升级 .NET Core 版本。

有关特定于每个操作系统的信息，请参阅以下内容。

**Windows**

Windows 的最新发行版[默认情况下启用了](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-) TLS 1.2 支持。如果你在 Windows 7 SP1 或 Windows Server 2008 R2 上运行 SP1，则需要确保注册表中启用 TLS 1.2 支持，如 windows [server/security/tls/tls-注册表设置 https://learn.microsoft.com/en-us/ \$1tls-](https://learn.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12) 12 中所述。如果您正在运行较早的发行版，则必须升级操作系统。有关 Windows 中 TLS 1.3 支持的信息，请查看最新的 Microsoft 文档，了解所需的最低客户端或服务器版本。

**macOS**

如果您正在运行 .NET Core 2.1 或更高版本，则默认情况下启用 TLS 1.2。[OS X Mavericks v10.9 或更高版本](https://support.apple.com/en-us/103373)支持 TLS 1.2。[.NET Core 版本 2.1 及更高版本需要较新版本的 macOS，详见？https://learn.microsoft.com/en-us/dotnet/core/install/windows tabs=net80&pivots=os-macos](https://learn.microsoft.com/en-us/dotnet/core/install/windows?tabs=net80&pivots=os-macos)。

如果您使用的是 .NET Core 1.0，则 .NET Core [在 macOS 上使用 OpenSSL](https://github.com/dotnet/announcements/issues/21)，这是一个必须单独安装的依赖项。OpenSSL 在 1.0.1 版本中增加了对 TLS 1.2 的支持，在 1.1.1 版本中增加了对 TLS 1.3 的支持。

**Linux**

Linux 上的 .NET Core 需要 OpenSSL，它与许多 Linux 发行版捆绑在一起。但也可以单独安装它。OpenSSL 在 1.0.1 版本中增加了对 TLS 1.2 的支持，在 1.1.1 版本中增加了对 TLS 1.3 的支持。如果您使用的是 .NET Core 的最新版本（2.1 或更高版本），并且已安装了程序包管理器，则可能已经为您安装了更高版本的 OpenSSL。

当然，您可以在终端中运行 **`openssl version`** 并验证版本是否低于 1.0.1。

## NET Framework。
<a name="enforcing-tls-dotnet-framework"></a>

如果您正在运行 .NET Framework 的最新版本（4.7 或更高版本）和 Windows 的最新版本（对于客户端，至少为 Windows 8；对于服务器，则为 Windows Server 2012 或更高版本），则默认情况下启用并使用 TLS 1.2。

如果你使用的.NET Framework 运行时不使用操作系统设置（.NET Framework 3.5 到 4.5.2），则 适用于 .NET 的 AWS SDK 会尝试在支持的协议中[添加对 TLS 1.1 和 TLS 1.2 的支持](https://github.com/aws/aws-sdk-net/blob/aws-sdk-net-v3.7/sdk/src/Core/Amazon.Runtime/Pipeline/HttpHandler/AmazonSecurityProtocolManager.cs)。如果您使用的是 .NET Framework 3.5，则只有在安装了适当的热补丁时才会成功，如下所示：
+ Windows 10 版本 1511 和 Windows Server 2016 — [KB3156421](https://support.microsoft.com/kb/3156421)
+ Windows 8.1 和 Windows Server 2012 R2 — [KB3154520](https://support.microsoft.com/kb/3154520)
+ Windows Server 2012 — [KB3154519](https://support.microsoft.com/kb/3154519)
+ Windows 7 SP1 和 Server 2008 R2 — SP1 [KB3154518](https://support.microsoft.com/kb/3154518)

**警告**  
从 2024 年 8 月 15 日起，他们 适用于 .NET 的 AWS SDK 将终止对.NET Framework 3.5 的支持，并将.NET Framework 的最低版本更改为 4.7.2。有关更多信息，请参阅博客文章 [Important changes coming for .NET Framework 3.5 and 4.5 targets of the 适用于 .NET 的 AWS SDK](https://aws.amazon.com/blogs/developer/important-changes-coming-for-net-framework-3-5-and-4-5-targets-of-the-aws-sdk-for-net/)。

如果你的应用程序在 Windows 7 SP1 或 Windows Server 2008 R2 的较新的.NET 框架上运行 SP1，则需要确保注册表中启用 TLS 1.2 支持，如 w [https://learn.microsoft.com/en-us/indows server/security/tls/tls-注册表设置 \$1tls-](https://learn.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12) 12 中所述。较新版本的 Windows [在默认情况下已启用](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-)它。

有关在.NET 框架中使用 TLS 的详细最佳实践，请参阅微软的文章，网址为[https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls](https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls)。

## AWS Tools for PowerShell
<a name="enforcing-tls-ps"></a>

[AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/)使用 适用于 .NET 的 AWS SDK 所有 AWS 服务呼叫。环境的行为取决于 PowerShell 你运行的 Windows 版本，如下所示。

**Windows PowerShell 2.0 到 5.x**

Windows PowerShell 2.0 到 5.x 在.NET 框架上运行。您可以使用以下命令验证正在使用哪个.NET 运行时（2.0 或 4.0）。 PowerShell 

```
$PSVersionTable.CLRVersion
```
+ 使用 .NET Runtime 2.0 时，请按照之前提供的有关 适用于 .NET 的 AWS SDK 和 .NET Framework 3.5 的说明进行操作。
**警告**  
从 2024 年 8 月 15 日起，他们 适用于 .NET 的 AWS SDK 将终止对.NET Framework 3.5 的支持，并将.NET Framework 的最低版本更改为 4.7.2。有关更多信息，请参阅博客文章 [Important changes coming for .NET Framework 3.5 and 4.5 targets of the 适用于 .NET 的 AWS SDK](https://aws.amazon.com/blogs/developer/important-changes-coming-for-net-framework-3-5-and-4-5-targets-of-the-aws-sdk-for-net/)。
+ 使用 .NET Runtime 4.0 时，请按照之前提供的有关 适用于 .NET 的 AWS SDK 和 .NET Framework 4\$1 的说明进行操作。

**Windows PowerShell 6.0**

Windows PowerShell 6.0 及更高版本可在.NET Core 上运行。您可以通过运行以下命令验证正在使用哪个版本的 .NET Core。

```
[System.Reflection.Assembly]::GetEntryAssembly().GetCustomAttributes([System.Runtime.Versioning.TargetFrameworkAttribute], $true).FrameworkName
```

按照之前提供的有关.NET Core 适用于 .NET 的 AWS SDK 及相关版本的说明进行操作。

## Xamarin
<a name="enforcing-tls-xamarin"></a>

[对于 Xamarin，请参阅-layer-security 中的说明。https://learn.microsoft.com/en-us/ xamarin/cross-platform/app-fundamentals/transport](https://learn.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/transport-layer-security)总而言之：

**对于 Android**
+ 需要 Android 5.0 或更高版本。
+ **项目属性**，**Android 选项**： HttpClient 实现必须设置为 **Android**， SSL/TLS 实现必须设置为 **Native TLS 1.2\$1**。

**对于 iOS**
+ 需要 iOS 7 或更高版本。
+ 必须将 “**项目属性**”、“**iOS 构建**： HttpClient实现” 设置为 “**NSUrl会话**”。

**对于 macOS**
+ 需要 macOS 10.9 或更高版本。
+ 必须将 **“项目选项”、“****构建**”、“**Mac Build**： HttpClient 实现” 设置为 “**NSUrl会话**”。

## Unity
<a name="enforcing-tls-unity"></a>

您必须使用 Unity 2018.2 或更高版本，并使用 .NET 4.x 等效脚本运行时。你可以在 **“项目设置”、“**配置**”、“**播放器**” 中进行设置**，如 [https://docs.unity3d.com/2019.1/Documentation/Manual/ScriptingRuntimeUpgrade.html](https://docs.unity3d.com/2019.1/Documentation/Manual/ScriptingRuntimeUpgrade.html) 中所述。.NET 4.x 等效脚本运行时为所有运行 Mono 或 IL2 CPP 的 Unity 平台启用 TLS 1.2 支持。

## 浏览器（适用于 Blazor WebAssembly）
<a name="enforcing-tls-browser"></a>

WebAssembly 在浏览器而不是服务器上运行，并使用浏览器处理 HTTP 流量。因此，TLS 支持由浏览器支持确定。

[在 ASP.NET Core 3.1 的预览版中，只有支持的浏览器才支持 Blaz WebAssembly or WebAssembly，如平台中所述。https://learn.microsoft.com/en-us/ aspnet/core/blazor/supported](https://learn.microsoft.com/en-us/aspnet/core/blazor/supported-platforms)所有主流浏览器在支持之前都支持 TLS 1.2 WebAssembly。如果您的浏览器是这种情况，那么如果您的应用程序运行，它可以通过 TLS 1.2 进行通信。

有关更多信息和验证，请参阅浏览器的文档。

# 亚马逊 S3 加密客户端迁移（从 V1 到 V2）
<a name="s3-encryption-migration-v1-v2"></a>

**注意**  
如果您使用的是 V2 并希望迁移到 V4，请参阅。[亚马逊 S3 加密客户端迁移（从 V2 到 V4）](s3-encryption-migration-v2-v4.md)

此主题介绍了如何将应用程序从 Amazon Simple Storage Service（Amazon S3）加密客户端的版本 1 (V1) 迁移到版本 2 (V2)，并确保应用程序在整个迁移过程中的可用性。

使用 V2 客户端加密的对象无法使用 V1 客户端解密。为了便于迁移到新客户端，而不必同时重新加密所有对象，我们提供了“V1 过渡”客户端。此客户端可以*解密* V1 和 V2 加密的对象，但只能*加密*与 V1 兼容的格式的对象。V2 客户端可以*解密* V1 和 V2 加密的对象（当为 V1 对象启用时），但只能*加密*与 V2 兼容的格式的对象。

## 迁移概述
<a name="s3-encryption-migration-v1-v2-overview"></a>

这种迁移分三个阶段进行。此处将介绍这些阶段，稍后将详细介绍。在下一阶段开始之前，必须完成*所有*使用共享对象的客户端的每个阶段。

1. **将现有客户端更新为 V1 过渡客户端以读取新格式。**首先，更新您的应用程序，使其依赖于 V1 过渡客户端，而不是 V1 客户端。V1 过渡客户端使您的现有代码能够解密新 V2 客户端编写的对象和以 V1 兼容格式编写的对象。
**注意**  
V1 过渡客户端仅用于迁移目的。移至 V1 过渡客户端后，继续升级到 V2 客户端。

1. **将 V1 过渡客户端迁移到 V2 客户端以编写新格式。**接下来，将应用程序中的所有 V1 过渡客户端替换为 V2 客户端，并将安全配置文件设置为 `V2AndLegacy`。在 V2 客户端上设置此安全配置文件可使这些客户端解密以 V1 兼容格式加密的对象。

1. **更新 V2 客户端，使其不再读取 V1 格式。**最后，在所有客户端都迁移到 V2 并且所有对象都已以 V2 兼容格式加密或重新加密之后，请将 V2 安全配置文件设置为 `V2` 而不是 `V2AndLegacy`。这可以防止解密 V1 兼容格式的对象。

## 将现有客户端更新为 V1 过渡客户端以读取新格式
<a name="s3-encryption-migration-v1-v2-to-v1n"></a>

V2 加密客户端使用旧版本客户端不支持的加密算法。迁移的第一步是更新您的 V1 解密客户端，以便它们可以读取新格式。

V1 过渡客户端使您的应用程序能够解密 V1 和 V2 加密的对象。此客户端是 [Amazon.Extensions.S3.Encryption 软件包的一部分。](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet 在每个应用程序上执行以下步骤以使用 V1 过渡客户端。

1. 接受 [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) 程序包的依赖项。**如果您的项目直接依赖于 **AWSSDK.S3** 或AWSSDK. KeyManagementService**软件包，您必须更新这些依赖项或将其删除，以便将它们的更新版本与这个新软件包一起引入。

1. 将相应的 `using` 语句从 `Amazon.S3.Encryption` 更改为 `Amazon.Extensions.S3.Encryption`，如下所示：

   ```
   // using Amazon.S3.Encryption;
     using Amazon.Extensions.S3.Encryption;
   ```

1. 重新构建并重新部署您的应用程序。

V1 过渡客户端与 V1 客户端的 API 完全兼容，因此无需更改其它代码。

## 将 V1 过渡客户端迁移到 V2 客户端以写入新格式
<a name="s3-encryption-migration-v1-v2-v1n-to-v2"></a>

V2 客户端是 A [mazon.extens.](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet S3.Encryption 软件包的一部分。它使您的应用程序能够解密 V1 和 V2 加密的对象（如果配置为这样做），但只能加密 V2 兼容格式的对象。

更新现有客户端以读取新的加密格式后，您可以继续将应用程序安全更新到 V2 加密和解密客户端。在每个应用程序上执行以下步骤以使用 V2 客户端：

1. 将 `EncryptionMaterials` 更改为 `EncryptionMaterialsV2`。

   1. 使用 KMS 时：

      1. 提供 KMS 密钥 ID。

      1. 声明您正在使用的加密方法；即 `KmsType.KmsContext`。

      1. 向 KMS 提供与该数据密钥关联的加密上下文。您可以发送空字典（Amazon 加密上下文仍将合并到其中），但鼓励提供更多上下文。

   1. 使用用户提供的密钥封装方法（对称或非对称加密）时：

      1. 提供包含加密材料的 `AES` 或 `RSA` 实例。

      1. 声明要使用哪种加密算法；也就是说，`SymmetricAlgorithmType.AesGcm` 还是 `AsymmetricAlgorithmType.RsaOaepSha1`。

1. 将 `AmazonS3CryptoConfiguration` 更改为 `AmazonS3CryptoConfigurationV2`，`SecurityProfile` 属性设置为 `SecurityProfile.V2AndLegacy`。

1. 将 `AmazonS3EncryptionClient` 更改为 `AmazonS3EncryptionClientV2`。此客户端采用前面步骤中新转换的 `AmazonS3CryptoConfigurationV2` 和 `EncryptionMaterialsV2` 对象。

### 示例：KMS 到 KMS\$1Context
<a name="s3-encryption-migration-v1-v2-ex-kms"></a>

**迁移前**

```
using System.Security.Cryptography;
using Amazon.S3.Encryption;

var encryptionMaterial = new EncryptionMaterials("1234abcd-12ab-34cd-56ef-1234567890ab");
var configuration = new AmazonS3CryptoConfiguration()
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);
```

**迁移后**

```
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

var encryptionContext = new Dictionary<string, string>();
var encryptionMaterial = new EncryptionMaterialsV2("1234abcd-12ab-34cd-56ef-1234567890ab", KmsType.KmsContext, encryptionContext);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
```

### 示例：对称算法（AES-CBC 到 AES-GCM 密钥封装）
<a name="s3-encryption-migration-v1-v2-ex-aes"></a>

`StorageMode` 可以是 `ObjectMetadata` 或 `InstructionFile`。

**迁移前**

```
using System.Security.Cryptography;
using Amazon.S3.Encryption;

var symmetricAlgorithm = Aes.Create();
var encryptionMaterial = new EncryptionMaterials(symmetricAlgorithm);
var configuration = new AmazonS3CryptoConfiguration()
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);
```

**迁移后**

```
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

var symmetricAlgorithm = Aes.Create();
var encryptionMaterial = new EncryptionMaterialsV2(symmetricAlgorithm, SymmetricAlgorithmType.AesGcm);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
```

**注意**  
使用 AES-GCM 解密时，在开始使用解密的数据之前，请通读整个对象。这是为了验证对象自加密以来是否未对其进行过修改。

### 示例：非对称算法（RSA 到 RSA-OAEP-SHA 1 密钥封装）
<a name="s3-encryption-migration-v1-v2-ex-rsa"></a>

`StorageMode` 可以是 `ObjectMetadata` 或 `InstructionFile`。

**迁移前**

```
using System.Security.Cryptography;
using Amazon.S3.Encryption;

var asymmetricAlgorithm = RSA.Create();
var encryptionMaterial = new EncryptionMaterials(asymmetricAlgorithm);
var configuration = new AmazonS3CryptoConfiguration()
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);
```

**迁移后**

```
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

var asymmetricAlgorithm = RSA.Create();
var encryptionMaterial = new EncryptionMaterialsV2(asymmetricAlgorithm, AsymmetricAlgorithmType.RsaOaepSha1);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
```

## 将 V2 客户端更新为不再读取 V1 格式
<a name="s3-encryption-migration-v1-v2-v2-cleanup"></a>

最终，所有对象都将使用 V2 客户端进行加密或重新加密。*转换完成后*，您可以通过将 `SecurityProfile` 属性设置为 `SecurityProfile.V2`，在 V2 客户端中禁用 V1 兼容性，如以下代码片段所示。

```
//var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2);
```

# 亚马逊 S3 加密客户端迁移（从 V2 到 V4）
<a name="s3-encryption-migration-v2-v4"></a>

**注意**  
如果您使用的是 V1 并希望迁移到 V4，则必须先迁移到 V2。请参阅[亚马逊 S3 加密客户端迁移（从 V1 到 V2）](s3-encryption-migration-v1-v2.md)。

本主题介绍如何将您的应用程序从亚马逊简单存储服务 (Amazon S3) Simple Service 加密客户端的版本 2 (V2) 迁移到版本 4 (V4)，并确保应用程序在整个迁移过程中的可用性。V4 使用带有密钥承诺的 AES-GCM 进行内容加密，并引入了承诺策略来增强针对密钥替换攻击的安全性。

V4 客户端在 A [mazon.extens.](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet S3.Encryptions 软件包中可用。

**重要**  
**重大更改：**使用`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`策略配置的 V4 客户端无法解密使用 V1 或 V2 客户端加密的对象。只有最新的 V2 客户端才能使用密钥承诺解密 v4 加密的对象。在转向`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`策略之前，您必须使用启用密钥承诺的 V4 客户端重新加密所有现有数据。

## 理解 V4 概念
<a name="s3-encryption-migration-v2-v4-concepts"></a>

V4 使用带有密钥承诺的 AES-GCM 进行内容加密，并引入了增强加密数据保护的关键安全概念：

### 承诺政策
<a name="s3-encryption-migration-v2-v4-concepts-policy"></a>

承诺策略控制加密客户端在加密和解密操作期间如何处理密钥承诺。V4 支持三种承诺策略：

`FORBID_ENCRYPT_ALLOW_DECRYPT`  
*加密：*无需承诺  
*解密：*允许不提交对象  
*安全：*不强制承诺，可能允许篡改  
*兼容性：*所有 V2 和 V4 实现都可以读取使用此策略加密的对象

`REQUIRE_ENCRYPT_ALLOW_DECRYPT`  
*加密：*使用密钥承诺  
*解密：*允许提交和不提交对象  
*安全：*保护新对象免受密钥替换攻击，旧对象仍然可读  
*兼容性：*只有 V4 支持此政策

`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`（V4 的默认设置）  
*加密：*使用密钥承诺  
*解密：仅提交*对象  
*安全：*全面执行承诺，最大限度地提高安全性  
*兼容性：*只有 V4 支持此政策

### 带有关键承诺的 AES GCM
<a name="s3-encryption-migration-v2-v4-concepts-aesgcm"></a>

V4 使用带有密钥承诺的 AES-GCM 进行内容加密，从而增强了安全性：
+ *篡改保护：*它通过加密方式将密钥绑定到加密数据来防止密钥替换攻击。
+ *版本兼容性：*使用密钥承诺加密的对象只能由 V4 客户端和更高版本解密。

**警告**  
在生产环境中启用密钥承诺加密之前，请确保所有需要解密对象的应用程序都已升级到 V4 或更高版本，因为 V2 客户端已被弃用。

## 更新现有客户端以读取 V4 格式
<a name="s3-encryption-migration-v2-v4-update-clients"></a>

V4 加密客户端使用旧版本的客户端不支持的加密算法。迁移的第一步是更新您的 V2 客户端，以便它们可以读取新的 V4 格式。

### 更新 Pac NuGet kage 依赖关系
<a name="s3-encryption-migration-v2-v4-update-nuget"></a>

更新您的应用程序以使用包含 V4 支持的最新版本的 [Amazon.extensions.S3.Encryption 软件包](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet 。对每个应用程序执行以下步骤：

1. 更新到最新的 [Amazon.extens.S3.Encryption 软件](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) **如果您的项目直接依赖于 **AWSSDK.S3** 或AWSSDK. KeyManagementService**软件包，您必须更新这些依赖项或将其删除，以便将它们的更新版本与这个新软件包一起引入。

1. 确保您的`using`语句引用了正确的命名空间：

   ```
   using Amazon.Extensions.S3.Encryption;
   using Amazon.Extensions.S3.Encryption.Primitives;
   ```

1. 重新构建并重新部署您的应用程序。

您现有的 V2 客户端将继续使用更新的软件包，并且能够解密由 V4 客户端加密的对象（取决于所使用的承诺策略）。

### 构建和部署应用程序
<a name="s3-encryption-migration-v2-v4-build-deploy"></a>

更新 NuGet 软件包依赖关系后：

1. 构建您的应用程序以确保正确解析所有依赖关系。

1. 在开发环境中测试您的应用程序，以验证现有功能是否可以继续运行。

1. 将更新的应用程序部署到您的生产环境。

此更新使您现有的 V2 客户端能够解密将由 V4 客户端加密的对象，从而确保迁移过程中的兼容性。

## 迁移到 V4 客户端
<a name="s3-encryption-migration-v2-v4-migrate"></a>

更新现有客户端以读取新的加密格式后，您可以继续安全地更新应用程序以使用 V4 加密和解密客户端。V4 客户端通过密钥承诺提供增强的安全性，同时保持与现有加密对象的兼容性。

### 4 步迁移流程
<a name="s3-encryption-migration-v2-v4-migrate-steps"></a>

从 V2 迁移到 V4 遵循结构化的 4 步流程，以确保兼容性和安全性。每个步骤都代表一个特定的配置，在继续下一步之前，应在所有应用程序中部署该配置。

1. **步骤 0：V2 客户端（起点）**-您现有的 V2 实现

1. **第 1 步：具有 V2 兼容性的 V4**-迁移到 V4 客户端，同时保持与 V2 兼容的加密行为

1. **第 2 步：使用密钥承诺写入的 V4**-开始使用密钥承诺进行加密，同时允许解密旧对象

1. **第 3 步：具有全面强制功能的 V4**-加密和解密都需要密钥承诺

### 步骤 0：V2 客户端（起点）
<a name="s3-encryption-migration-v2-v4-step0"></a>

这代表您现有的 V2 客户端配置。此步骤演示迁移前的起始状态。

```
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;
using Amazon.S3.Model;

// Step 0: V2 Client - Starting configuration
var encryptionContext = new Dictionary<string, string>();
var encryptionMaterial = new EncryptionMaterialsV2(kmsKeyId, KmsType.KmsContext, encryptionContext);

#pragma warning disable 0618
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2);
#pragma warning enable 0618

var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);

// Use the client for PutObject and GetObject operations
await encryptionClient.PutObjectAsync(new PutObjectRequest
{
    BucketName = bucket,
    Key = objectKey,
    ContentBody = content
});
```

### 第 1 步：具有 V2 兼容性的 V4
<a name="s3-encryption-migration-v2-v4-step1"></a>

迁移到 V4 客户端，同时保持与 V2 相同的行为。此步骤使用`FORBID_ENCRYPT_ALLOW_DECRYPT`策略进行加密，无需承诺即可进行加密，并允许对所有对象进行解密。

```
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;
using Amazon.S3.Model;

// Step 1: V4 Client with V2 compatibility
var encryptionContext = new Dictionary<string, string>();
var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext);

var configuration = new AmazonS3CryptoConfigurationV4(
    SecurityProfile.V4, 
    CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT, 
    ContentEncryptionAlgorithm.AesGcm);

var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial);

// Use the client for PutObject and GetObject operations
await encryptionClient.PutObjectAsync(new PutObjectRequest
{
    BucketName = bucket,
    Key = objectKey,
    ContentBody = content
});
```

**行为：**无需承诺即可加密，可以解密已提交和未提交的对象。与 V2 行为相同。

### 第 2 步：带有关键承诺写入的 V4
<a name="s3-encryption-migration-v2-v4-step2"></a>

使用密钥承诺开始加密，同时保持解密的向后兼容性。此步骤使用`REQUIRE_ENCRYPT_ALLOW_DECRYPT`策略。

**警告**  
在部署步骤 2 之前，请确保所有读取器都已更新到步骤 1 或更高版本以处理密钥承诺加密。

```
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;
using Amazon.S3.Model;

// Step 2: V4 Client with key commitment writes
var encryptionContext = new Dictionary<string, string>();
var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext);

var configuration = new AmazonS3CryptoConfigurationV4(
    SecurityProfile.V4, 
    CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT, 
    ContentEncryptionAlgorithm.AesGcmWithCommitment);

var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial);

// Use the client for PutObject and GetObject operations
await encryptionClient.PutObjectAsync(new PutObjectRequest
{
    BucketName = bucket,
    Key = objectKey,
    ContentBody = content
});
```

**行为：**使用承诺进行加密，可以解密已提交和未提交的对象。保护新对象免受密钥替换攻击。

### 第 3 步：全面强制执行的 V4
<a name="s3-encryption-migration-v2-v4-step3"></a>

加密和解密都需要密钥承诺。此步骤使用`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`策略来最大限度地提高安全性。

**警告**  
在部署步骤 3 之前，请确保系统中的所有对象都已使用密钥承诺重新加密（步骤 2）。此步骤将无法解密未经承诺加密的对象。

```
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;
using Amazon.S3.Model;

// Step 3: V4 Client with full key commitment enforcement
var encryptionContext = new Dictionary<string, string>();
var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext);

var configuration = new AmazonS3CryptoConfigurationV4(
    SecurityProfile.V4, 
    CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT, 
    ContentEncryptionAlgorithm.AesGcmWithCommitment);

var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial);

// Use the client for PutObject and GetObject operations
await encryptionClient.PutObjectAsync(new PutObjectRequest
{
    BucketName = bucket,
    Key = objectKey,
    ContentBody = content
});
```

**行为：**使用承诺进行加密，仅解密使用承诺加密的对象。最大限度地抵御密钥替换攻击。

## 其他配置示例
<a name="s3-encryption-migration-v2-v4-examples"></a>

本节提供了在迁移期间使用不同选项配置 V4 客户端的其他示例。

### 启用旧版 Support
<a name="s3-encryption-migration-v2-v4-examples-legacy"></a>

要使 V4 客户端能够读取由 V1 和 V2 客户端加密的对象，请使用允许旧版解密的承诺策略配置客户端：

```
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

// Configure V4 client to read V1/V2 objects
var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};

// This configuration allows:
// - Encryption: With commitment (secure)
// - Decryption: Both V2 (non-committing) and V4 (committing) objects
```

当您需要解密由旧客户机加密的对象，同时确保以增强的安全性对新对象进行加密时，请在迁移期间使用此配置。

### 配置存储方法
<a name="s3-encryption-migration-v2-v4-examples-storage"></a>

V4 支持两种存储方法来存储加密元数据。选择最适合您的用例的方法：

**对象元数据（默认）**

```
var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
// Encryption metadata is stored in S3 object metadata
```

**指令文件**

```
var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT)
{
    StorageMode = CryptoStorageMode.InstructionFile
};
// Encryption metadata is stored in a separate S3 object (instruction file)
```

`InstructionFile`当您需要为其他目的保留对象元数据或处理有元数据大小限制的对象时使用。

### 配置承诺策略
<a name="s3-encryption-migration-v2-v4-examples-policy"></a>

根据您的安全要求和迁移阶段选择适当的承诺策略：

**迁移阶段（V2 兼容性）**

```
// For migration: encrypt without commitment, allow all decryption
var migrationConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT);
```

**过渡阶段（推荐）**

```
// For transition: encrypt with commitment, allow legacy decryption
var transitionConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
```

**完整安全阶段**

```
// For maximum security: require commitment for both encryption and decryption
var secureConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT);
```

从初始迁移`FORBID_ENCRYPT_ALLOW_DECRYPT`期间开始，进入过渡阶段，最后`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`在所有客户端都已升级并且所有对象都已通过承诺重新加密后使用。`REQUIRE_ENCRYPT_ALLOW_DECRYPT`