Amazon S3 暗号化クライアントの移行 - AWS SDK for Java 1.x

AWS SDK for Java 1.x は 2024 年 7 月 31 日にメンテナンスモードに移行し、2025 年 12 月 31 end-of-support日に終了します。新機能、可用性の向上、セキュリティ更新プログラムを引き続き受信AWS SDK for Java 2.xするには、 に移行することをお勧めします。

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

Amazon S3 暗号化クライアントの移行

このトピックでは、 Amazon Simple Storage Service () 暗号化クライアントのバージョン 1 (V1 Amazon S3) からバージョン 2 (V2) にアプリケーションを移行し、移行プロセスを通じてアプリケーションの可用性を確保する方法について説明します。

前提条件

Amazon S3 クライアント側の暗号化には、以下が必要です。

  • Java 8 以降がアプリケーション環境にインストールされていること。は、Oracle Java SE 開発キット、および 、Red Hat OpenJDK Amazon Corretto、 などの Open Java 開発キット (Open JDK) のディストリビューションで AWS SDK for Java 動作しますAdoptOpenJDK

  • Bouncy Castle Crypto パッケージ。Bouncy Castle .jar ファイルをアプリケーション環境のクラスパスに配置するか、Maven pom.xml ファイルに への artifactId bcprov-ext-jdk15on依存関係 ( groupId の org.bouncycastle) を追加できます。

移行の概要

この移行は 2 つのフェーズから構成されます。

  1. 新しいフォーマットを読み取るために既存のクライアントを更新します。バージョン 1.11.837 以降を使用するようにアプリケーションを更新 AWS SDK for Java し、アプリケーションを再デプロイします。これにより、アプリケーション内の Amazon S3 クライアント側の暗号化サービスクライアントは、V2 サービスクライアントによって作成されたオブジェクトを復号できます。アプリケーションが複数の を使用している場合は AWS SDKs、それぞれをSDK個別に更新する必要があります。

  2. 暗号化および復号クライアントを V2 に移行します。すべての V1 暗号化クライアントが V2 暗号化形式を読み取れるようになったら、アプリケーションコードの Amazon S3 クライアント側の暗号化クライアントと復号クライアントを更新して、V2 に相当するものを使用します。

新しいフォーマットを読み取るために既存のクライアントを更新する

V2 暗号化クライアントは、 の古いバージョンではサポート AWS SDK for Java されていない暗号化アルゴリズムを使用します。

移行の最初のステップは、 AWS SDK for Javaのバージョン 1.11.837 以降を使用するように V1 暗号化クライアントを更新することです。(Java APIリファレンスバージョン 1.x にある最新バージョンに更新することをお勧めします)。これを実行するには、プロジェクト設定の依存関係を更新します。プロジェクト設定が更新されたら、プロジェクトを再構築して再デプロイします。

これらの手順を完了すると、アプリケーションの V1 暗号化クライアントは、V2 暗号化クライアントによって書き込まれたオブジェクトを読み取ることができるようになります。

プロジェクト設定の依存関係を更新する

プロジェクト設定ファイル (pom.xml や build.gradle など) を変更して、 AWS SDK for Javaのバージョン 1.11.837 以降を使用します。その後、プロジェクトを再構築して再デプロイします。

新しいアプリケーションコードをデプロイする前にこのステップを完了すると、移行プロセス中にフリート全体で暗号化と復号の操作の一貫性を保つことができます。

Maven を使用した例

pom.xml ファイルからのスニペット:

<dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>1.11.837</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

Gradle を使用した例

build.gradle ファイルからのスニペット:

dependencies { implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.837') implementation 'com.amazonaws:aws-java-sdk-s3' }

暗号化および復号クライアントを V2 に移行する

プロジェクトがSDK最新バージョンで更新されると、アプリケーションコードを V2 クライアントを使用するように変更できます。これを実行するには、新しいサービスクライアントビルダーを使用するように、最初にコードを更新します。その後、名前が変更されたビルダーのメソッドを使用して暗号化マテリアルを提供し、必要に応じてサービスクライアントをさらに設定します。

これらのコードスニペットは、 でクライアント側の暗号化を使用する方法を示し AWS SDK for Java、V1 と V2 の暗号化クライアントを比較します。

V1

// minimal configuration in V1; default CryptoMode.EncryptionOnly. EncryptionMaterialsProvider encryptionMaterialsProvider = ... AmazonS3Encryption encryptionClient = AmazonS3EncryptionClient.encryptionBuilder() .withEncryptionMaterials(encryptionMaterialsProvider) .build();

V2

// minimal configuration in V2; default CryptoMode.StrictAuthenticatedEncryption. EncryptionMaterialsProvider encryptionMaterialsProvider = ... AmazonS3EncryptionV2 encryptionClient = AmazonS3EncryptionClientV2.encryptionBuilder() .withEncryptionMaterialsProvider(encryptionMaterialsProvider) .withCryptoConfiguration(new CryptoConfigurationV2() // The following setting allows the client to read V1 encrypted objects .withCryptoMode(CryptoMode.AuthenticatedEncryption) ) .build();

上記の例では、cryptoModeAuthenticatedEncryption に設定しています。これは、V1 暗号化クライアントによって書き込まれたオブジェクトを V2 暗号化クライアントが読み取ることを許可する設定です。クライアントが V1 クライアントによって書き込まれたオブジェクトを読み取る機能を必要としない場合は、代わりにデフォルト設定の StrictAuthenticatedEncryption を使用することをお勧めします。

V2 暗号化クライアントをコンストラクトする

V2 暗号化クライアントは、AmazonS3EncryptionClientV2.encryptionBuilder() を呼び出すことで構築できます。

既存のすべての V1 暗号化クライアントを V2 暗号化クライアントに置き換えることができます。V2 暗号化クライアントは、「」を使用するように V2 暗号化クライアントを設定することで、V1 暗号化クライアントによって書き込まれたオブジェクトをいつでも読み取ることができますAuthenticatedEncryption`cryptoMode

新しい V2 暗号化クライアントの作成は、V1 暗号化クライアントの作成方法と非常によく似ています。ただし、いくつか違いがあります。

  • CryptoConfiguration オブジェクトの代わりに、CryptoConfigurationV2 オブジェクトを使用してクライアントを設定します。このパラメータは必須です。

  • V2 暗号化クライアントのデフォルトの cryptoMode 設定は StrictAuthenticatedEncryption です。V1 暗号化クライアントの場合は EncryptionOnly です。

  • 暗号化クライアントビルダーのメソッド withEncryptionMaterials() の名前が withEncryptionMaterialsProvider() に変更されました。これは、単に引数の型をより正確に反映するための外観上の変更です。サービスクライアントを設定する際には、新しいメソッドを使用する必要があります。

注記

AES- で復号する場合はGCM、復号されたデータの使用を開始する前に、オブジェクト全体を最後まで読み取ります。これは、オブジェクトが暗号化されてから変更されていないことを確認するためものステップです。

暗号化マテリアルプロバイダーを使用する

V1 暗号化クライアントで既に使用しているものと同じ暗号化マテリアルプロバイダーおよび暗号化マテリアルオブジェクトを引き続き使用できます。これらのクラスは、暗号化クライアントがデータを保護するために使用するキーを提供する役割を果たします。これらは、V2 および V1 暗号化クライアントの両方と互換的に使用できます。

V2 暗号化クライアントを設定する

V2 暗号化クライアントは CryptoConfigurationV2 オブジェクトで設定されます。このオブジェクトは、デフォルトのコンストラクターを呼び出し、必要に応じてデフォルトからプロパティを変更することで構築できます。

CryptoConfigurationV2 のデフォルト値は次のとおりです。

  • cryptoMode = CryptoMode.StrictAuthenticatedEncryption

  • storageMode = CryptoStorageMode.ObjectMetadata

  • secureRandom = SecureRandom のインスタンス

  • rangeGetMode = CryptoRangeGetMode.DISABLED

  • unsafeUndecryptableObjectPassthrough = false

EncryptionOnly は V2 暗号化クライアントcryptoModeではサポートされていません。V2 暗号化クライアントは常に認証された暗号化を使用してコンテンツを暗号化し、V2 KeyWrap オブジェクトを使用してコンテンツ暗号化キー (CEKs) を保護します。

次の例は、V1 で暗号化設定を指定する方法と、CryptoConfigurationV2 暗号化クライアントビルダーに渡す V2 オブジェクトをインスタンス化する方法を示しています。

V1

CryptoConfiguration cryptoConfiguration = new CryptoConfiguration() .withCryptoMode(CryptoMode.StrictAuthenticatedEncryption);

V2

CryptoConfigurationV2 cryptoConfiguration = new CryptoConfigurationV2() .withCryptoMode(CryptoMode.StrictAuthenticatedEncryption);

その他の例

次の例は、V1 から V2 への移行に関連する特定のユースケースに対処する方法を示しています。

V1 暗号化クライアントによって作成されたオブジェクトを読み取るようにサービスクライアントを設定する

以前に V1 暗号化クライアントを使用して作成されたオブジェクトを読み取るには、cryptoModeAuthenticatedEncryption に設定します。次のコードスニペットは、この設定で設定オブジェクトを構築する方法を示しています。

CryptoConfigurationV2 cryptoConfiguration = new CryptoConfigurationV2() .withCryptoMode(CryptoMode.AuthenticatedEncryption);

オブジェクトのバイト範囲を取得するようにサービスクライアントを設定する

暗号化された S3 オブジェクトからバイト範囲を get できるようにするには、新しい設定 rangeGetMode を有効にします。この設定は、V2 暗号化クライアントではデフォルトで無効になっています。有効になっている場合でも、範囲設定された get は、クライアントの cryptoMode 設定でサポートされているアルゴリズムを使用して暗号化されたオブジェクトでのみ機能することに注意してください。詳細については、 リファレンスCryptoRangeGetModeの AWS SDK for Java API「」を参照してください。

を使用して V2 暗号化クライアントを使用して暗号化された Amazon S3 オブジェクトのマルチパートダウンロード Amazon S3 TransferManager を実行する場合は、まず V2 暗号化クライアントで rangeGetMode設定を有効にする必要があります。

次のコードスニペットは、範囲設定された get を実行するために V2 クライアントを設定する方法を示しています。

// Allows range gets using AES/CTR, for V2 encrypted objects only CryptoConfigurationV2 cryptoConfiguration = new CryptoConfigurationV2() .withRangeGetMode(CryptoRangeGetMode.ALL); // Allows range gets using AES/CTR and AES/CBC, for V1 and V2 objects CryptoConfigurationV2 cryptoConfiguration = new CryptoConfigurationV2() .withCryptoMode(CryptoMode.AuthenticatedEncryption) .withRangeGetMode(CryptoRangeGetMode.ALL);