View a markdown version of this page

SDK for Java で TLS の使用 - AWS SDK for Java 2.x

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

SDK for Java で TLS の使用

は、基盤となる Java プラットフォームの TLS 機能 AWS SDK for Java を使用します。このトピックでは、Amazon Corretto 17 で使用されている OpenJDK 実装を使用した例を紹介します。

を使用するには AWS のサービス、基盤となる JDK が TLS 1.2 の最小バージョンをサポートしている必要がありますが、TLS 1.3 が推奨されます。

TLS 1.3 はポスト量子暗号化を有効にするための前提条件であり、追加のアクションや設定が必要になる場合があります。詳細については、「ハイブリッドポスト量子 TLS の有効化」を参照してください。

ユーザーは、SDK で使用している Java プラットフォームのドキュメントを参照して、デフォルトで有効になっている TLS バージョンと、特定の TLS バージョンを有効または無効にする方法を確認する必要があります。

TLS バージョン情報を確認する方法

OpenJDK を使用した次のコードは、SSLContext を使用して、サポートされている TLS/SSL バージョンを出力する方法を示しています。

System.out.println(Arrays.toString(SSLContext.getDefault().getSupportedSSLParameters().getProtocols()));

たとえば、Amazon Corretto 17 (OpenJDK) は以下の出力を生成します。

[TLSv1.3, TLSv1.2, TLSv1.1, TLSv1, SSLv3, SSLv2Hello]

動作中の SSL ハンドシェイクと使用されている TLS のバージョンを確認するには、システムプロパティ javax.net.debug を使用します。

たとえば、TLS を使用する Java アプリケーションを実行します。

java app.jar -Djavax.net.debug=ssl:handshake

アプリケーションでは、次のような SSL ハンドシェイクがログ記録されます。

... javax.net.ssl|DEBUG|10|main|2022-12-23 13:53:12.221 EST|ClientHello.java:641|Produced ClientHello handshake message ( "ClientHello": { "client version" : "TLSv1.2", ... javax.net.ssl|DEBUG|10|main|2022-12-23 13:53:12.295 EST|ServerHello.java:888|Consuming ServerHello handshake message ( "ServerHello": { "server version" : "TLSv1.2", ...
AWS CRT HTTP クライアント TLS デバッグ

AWS CRT HTTP クライアントを使用する場合、前述の例に示す Java TLS デバッグプロパティは、CRT が独自の TLS スタックを使用するため、効果がありません。CRT HTTP クライアントを使用してネットワークレベルのリクエストの詳細を検査するには、ワイヤログ記録を有効にします。詳細については、「ワイヤログの有効化」を参照してください。

最小 TLS バージョンを強制する

SDK for Java は、プラットフォームとサービスでサポートされている最新の TLS バージョンを常に優先します。特定の最小 TLS バージョンを適用するアプローチは、使用する HTTP クライアントによって異なります。

Java TLS スタックを使用する Apache、Netty、URL Connection HTTP クライアントの場合は、システムプロパティ を使用しますjdk.tls.client.protocols。例えば、SDK サービスクライアントに TLS 1.3 を適用するには、次のシステムプロパティを指定します。

java -Djdk.tls.client.protocols=TLSv1.3 -jar app.jar

TLS バージョンの設定の詳細については、Java プラットフォームのドキュメントを参照してください。

独自の TLS スタックを使用する AWS CRT HTTP クライアントの場合、jdk.tls.client.protocolsシステムプロパティは効果がありません。代わりに、minTlsVersionビルダーオプションを使用して最小 TLS バージョンを適用します。

TlsVersion 列挙型 (software.amazon.awssdk.http.crt.TlsVersion) には、次の値があります。

TLS_1_3

最小バージョンとして TLS 1.3 を適用します。

SYSTEM_DEFAULT

プラットフォームのデフォルトの TLS バージョンネゴシエーション動作を使用します。

次の例では、TLS 1 AWS .3 を最小バージョンとして適用する同期 CRT HTTP クライアントを作成します。

import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.http.crt.TlsVersion; AwsCrtHttpClient httpClient = AwsCrtHttpClient.builder() .minTlsVersion(TlsVersion.TLS_1_3) .build();

次の例では、TLS 1 AWS .3 を最小バージョンとして適用する非同期 CRT HTTP クライアントを作成します。

import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.http.crt.TlsVersion; AwsCrtAsyncHttpClient asyncHttpClient = AwsCrtAsyncHttpClient.builder() .minTlsVersion(TlsVersion.TLS_1_3) .build();

その後、設定された HTTP クライアントを AWS サービスクライアントに渡すことができます。

import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.http.crt.TlsVersion; S3Client s3Client = S3Client.builder() .httpClientBuilder(AwsCrtHttpClient.builder() .minTlsVersion(TlsVersion.TLS_1_3)) .build();
TLS 1.3 の macOS 要件

デフォルトの macOS CRT TLS バックエンドである Apple Secure Transport は、TLS 1.3 をサポートしていません。macOS TlsVersion.TLS_1_3で を使用するには、アプリケーションを起動する前に、環境変数AWS_CRT_USE_NON_FIPS_TLS_13を空でない値に設定する必要があります。これにより、CRT が s2n-tls バックエンドに切り替わります。

この環境変数を使用する場合は、次の考慮事項に注意してください。

  • s2n-tls バックエンドは FIPS 検証されていません。

  • s2n-tls バックエンドは macOS Keychain と統合されません。

この環境変数を macOS に設定しない場合、最初のリクエストは CRT 側のエラーで失敗します。

ポスト量子 TLS 設定による相互除外

postQuantumTlsEnabled(false)と組み合わせることはできませんminTlsVersion(TlsVersion.TLS_1_3)。これらのオプションは、CRT TLS コンテキストでは相互に排他的です。両方を指定すると、ビルダーは をスローしますIllegalStateException

AWS API エンドポイントを TLS 1.2 にアップグレードする

最小バージョンの TLS 1.2 に移行する AWS API エンドポイントの詳細については、このブログ記事を参照してください。