Amazon S3 加密客户端客户端 - 适用于 Ruby 的 Amazon 开发工具包
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon S3 加密客户端客户端

本主题介绍如何将应用程序从 Amazon 简单存储服务 (Amazon S3) 加密客户端的版本 1 (V1) 迁移到版本 2 (V2),并确保应用程序在整个迁移过程中的可用性。

迁移概述

此迁移分两个阶段发生:

1. 更新现有客户端以读取新格式。 首先,部署更新版本的Amazon适用 SDK for Ruby 添加到您的应用程序。这将允许现有 V1 加密客户端解密新 V2 客户端写入的对象。如果您的应用程序使用多个Amazon软件开发工具包,您必须单独升级每个 SDK。

2. 将加密和解密客户端迁移到 V2。 一旦所有 V1 加密客户端都可以读取新格式,您就可以将现有的加密和解密客户端迁移到其各自的 V2 版本。

更新现有客户端以读取新格式

V2 加密客户端使用旧版本的客户端不支持的加密算法。迁移的第一步是将 V1 解密客户端更新到最新的 SDK 版本。完成此步骤后,应用程序的 V1 客户端将能够解密由 V2 加密客户端加密的对象。请参阅下面的每个主要版本Amazon适 SDK for Ruby。

更新Amazon适 SDK for Ruby 版本 3

版本 3 是最新版本的Amazon适用于 Ruby 的开发工具包。要完成此迁移,您需要使用 1.76.0 版或更高版本的aws-sdk-s3宝石。

从命令行安装

对于安装aws-sdk-s3gem,请使用版本选项验证是否安装了 1.76.0 的最低版本。

gem install aws-sdk-s3 -v '>= 1.76.0'

使用 Gemfile

对于使用 Gemfile 管理依赖关系的项目,请设置aws-sdk-s3创业板到 1.76.0。例如:

gem 'aws-sdk-s3', '>= 1.76.0'
  1. 修改您的 Gemfile。

  2. 运行 bundle update aws-sdk-s3。要验证您的版本,请运行bundle info aws-sdk-s3

更新Amazon适 SDK for Ruby 版本 2

的版本 2AmazonSDK for Ruby 工具包将输入维护模式于 2021 年 11 月 21 日举行。要完成此迁移,您需要使用 aws-sdk Gem 的版本 2.11.562 或更高版本。

从命令行安装

对于安装aws-sdkgem,从命令行使用版本选项来验证是否安装了最低版本的 2.11.562。

gem install aws-sdk -v '>= 2.11.562'

使用 Gemfile

对于使用 Gemfile 管理依赖关系的项目,请设置aws-sdk创业板升至 2.11.562. 例如:

gem 'aws-sdk', '>= 2.11.562'
  1. 修改您的 Gemfile。如果您有 GEMFile .lock 文件,请删除或更新该文件。

  2. 运行 bundle update aws-sdk。要验证您的版本,请运行bundle info aws-sdk

将加密和解密客户端迁移到 V2

更新客户端以读取新的加密格式后,您可以将应用程序更新到 V2 加密和解密客户端。以下步骤演示如何成功将代码从 V1 迁移到 V2。

在更新代码以使用 V2 加密客户端之前,请确保您已遵循上述步骤并使用aws-sdk-s3创业板版本 2.11.562 或更高版本。

注意

使用 AES-GCM 进行解密时,在开始使用解密的数据之前,读取整个对象的末尾。这是为了验证对象自加密以来是否未被修改。

配置 V2 加密客户端

这些区域有:加密 V2። 客户端需要其他配置。有关详细配置信息,请参阅加密 v2። 客户端文档或本主题后面提供的示例。

1. 必须在客户端构造时指定密钥包装方法和内容加密算法。 在创建新EncryptionV2::Client,您需要为key_wrap_schemacontent_encryption_schema

key_wrap_schema-如果您正在使用Amazon KMS,则必须将其设为:kms_context。如果您使用的是对称 (AES) 键,则必须将其设置为:aes_gcm。如果您使用的是非对称 (RSA) 密钥,则必须将其设置为:rsa_oaep_sha1

content_encryption_schema-此项必须设置为: 没有填充

2.必须在客户端构造时指定安全配置文件。在创建新EncryptionV2::Client,您需要向提供一个security_profile。这些区域有:安全配置文件参数确定了对读取使用旧版 V1 写入的对象的支持Encryption::Client。有两个值::v2: v2 和传统。要支持迁移,请将security_profile: v2 和传统。使用:v2仅用于新应用程序开发。

3.Amazon KMS 默认情况下强制执行 CMK ID。V1.Encryption::Clientkms_key_id用于创建客户端未提供给Amazon KMS Decrypt call。Amazon KMS可以从元数据中获取此信息并将其添加到对称密文 blob 中。在 V2 中,电子加密 v2። 客户端 `,kms_key_id传递给Amazon KMS解密调用,如果调用与用于加密对象的密钥不匹配,则调用将失败。如果您的代码以前依赖于不设置特定的kms_key_id,要么设置kms_key_id: :kms_allow_decrypt_with_any_cmk在客户端创建或设置kms_allow_decrypt_with_any_cmk: true上的get_object调用。

例如:使用对称 (AES) 密钥

预迁移

client = Aws::S3::Encryption::Client.new(encryption_key: aes_key) client.put_object(bucket: bucket, key: key, body: secret_data) resp = client.get_object(bucket: bucket, key: key)

后迁移

client = Aws::S3::EncryptionV2::Client.new( encryption_key: rsa_key, key_wrap_schema: :rsa_oaep_sha1, # the key_wrap_schema must be rsa_oaep_sha1 for asymmetric keys content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client ) client.put_object(bucket: bucket, key: key, body: secret_data) # No changes resp = client.get_object(bucket: bucket, key: key) # No changes

例如:使用Amazon KMS带有 kms_key_id

预迁移

client = Aws::S3::Encryption::Client.new(kms_key_id: kms_key_id) client.put_object(bucket: bucket, key: key, body: secret_data) resp = client.get_object(bucket: bucket, key: key)

后迁移

client = Aws::S3::EncryptionV2::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, # the key_wrap_schema must be kms_context for KMS keys content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client ) client.put_object(bucket: bucket, key: key, body: secret_data) # No changes resp = client.get_object(bucket: bucket, key: key) # No change

例如:使用Amazon KMS不带 kms_key_id

预迁移

client = Aws::S3::Encryption::Client.new(kms_key_id: kms_key_id) client.put_object(bucket: bucket, key: key, body: secret_data) resp = client.get_object(bucket: bucket, key: key)

后迁移

client = Aws::S3::EncryptionV2::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, # the key_wrap_schema must be kms_context for KMS keys content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client ) client.put_object(bucket: bucket, key: key, body: secret_data) # No changes resp = client.get_object(bucket: bucket, key: key, kms_allow_decrypt_with_any_cmk: true) # To allow decrypting with any cmk

迁移后备选方案

如果您只使用 S2 加密客户端读取和解密(从不写入和加密)对象,请使用此代码。

client = Aws::S3::EncryptionV2::Client.new( kms_key_id: :kms_allow_decrypt_with_any_cmk, # set kms_key_id to allow all get_object requests to use any cmk key_wrap_schema: :kms_context, # the key_wrap_schema must be kms_context for KMS keys content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client ) resp = client.get_object(bucket: bucket, key: key) # No change