

 AWS SDK for .NET V3 がメンテナンスモードになりました。

[AWS SDK for .NET 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/)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon S3 暗号化クライアントの移行 (V1 から V2)
<a name="s3-encryption-migration-v1-v2"></a>

**注記**  
V2 を使用していて V4 に移行する場合は、「」を参照してください[Amazon 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 オブジェクトのサポートが有効になっていれば) V1 と V2 のどちらで暗号化されたオブジェクトでも*復号化*できますが、オブジェクトの*暗号化*には V2 互換形式のみを使用します。

## 移行の概要
<a name="s3-encryption-migration-v1-v2-overview"></a>

この移行は 3 つのフェーズを通じて行われます。各フェーズについては、後ほど詳しく説明します。次のフェーズを開始する前に、共有オブジェクトを使用する*すべての*クライアントで各フェーズを完了させる必要があります。

1. **既存のクライアントを V1 移行用クライアントに更新して、新しい形式を読み取るようにします。**最初にアプリケーションを更新して、V1 クライアントではなく V1 移行用クライアントに依存するようにします。V1 移行用クライアントを使用すると、新しい V2 クライアントで記述されたオブジェクトと V1 互換形式で記述されたオブジェクトを既存のコードで復号化できます。
**注記**  
V1 移行用クライアントは、移行のみを目的として提供されています。V1 移行用クライアントに移行した後は、V2 クライアントへのアップグレードに進んでください。

1. **V1 移行用クライアントを V2 クライアントに移行して、新しい形式を書き込むようにします。**次に、アプリケーション内のすべての V1 移行用クライアントを V2 クライアントに置き換え、セキュリティプロファイルを `V2AndLegacy` に設定します。V2 クライアントでこのセキュリティプロファイルを設定すると、クライアントは V1 互換形式で暗号化されたオブジェクトを復号化できるようになります。

1. **V2 クライアントを更新して V1 形式を読み取らないようにします。**最後に、すべてのクライアントの V2 への移行が完了し、すべてのオブジェクトが V2 互換フォーマットで暗号化または再暗号化されたら、V2 セキュリティプロファイルを `V2AndLegacy` の代わりに `V2` に設定します。こうすることで、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 クライアントは、[Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet パッケージの一部です。このクライアントを使用すると、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\$1コンテキスト
<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-SHA1 キーラップ)
<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);
```