AWS SDK for Rust 内での HTTP レベルの設定の構成 - AWS SDK for Rust

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

AWS SDK for Rust 内での HTTP レベルの設定の構成

AWS SDK for Rust には、コードで作成する AWS のサービス クライアントで使用される組み込み HTTP 機能が用意されています。

デフォルトでは、SDK for Rust は hyperrustls、および aws-lc-rs に基づく HTTPS クライアントを使用します。このクライアントは、追加の設定なしでほとんどのユースケースで問題なく機能します。

  • hyper は Rust 用の低レベルの HTTP ライブラリで、AWS SDK for Rust で API サービスコールを行うことができます。

  • rustls は、Rust で記述された最新の TLS ライブラリで、暗号化プロバイダー用のオプションが組み込まれています。

  • aws-lc は、TLS および一般的なアプリケーションに必要なアルゴリズムを含む汎用暗号化ライブラリです。

  • aws-lc-rs は、Rust の aws-lc ライブラリに対する慣用的なラッパーです。

別の TLS または暗号化プロバイダーを選択する場合、aws-smithy-http-client クレートには追加オプションと設定が複数用意されています。より高度なユースケースでは、独自の HTTP クライアントの実装を導入するか、検討のために機能リクエストを提出することをお勧めします。

代替 TLS プロバイダーの選択

aws-smithy-http-client クレートには、複数の代替 TLS プロバイダーが用意されています。

以下のプロバイダーが利用可能です。

rustlsaws-lc を使用する

rustls に基づく TLS プロバイダーで、暗号化に aws-lc-rs を使用します。

これは、SDK for Rust のデフォルトの HTTP 動作です。このオプションを使用する場合、コードで追加のアクションを実行する必要はありません。

s2n-tls

s2n-tls に基づく TLS プロバイダー。

rustlsaws-lc-fips を使用する

rustls に基づく TLS プロバイダーで、暗号化に aws-lc-rs の FIPS 準拠バージョンを使用します

rustlsring を使用する

rustls に基づく TLS プロバイダーで、暗号化に ring を使用します。

前提条件

aws-lc-rs または s2n-tls を使用するには、C コンパイラ (Clang または GCC) を構築する必要があります。一部のプラットフォームでは、ビルドに CMake が必要な場合があります。任意のプラットフォームで「fips」機能を使用して構築するには、CMake と Go が必要です。詳細については、「Rust 向け AWS Libcrypto (aws-lc-rs)」のリポジトリとビルド手順を参照してください。

代替 TLS プロバイダーの使用方法

aws-smithy-http-client クレートには、追加の TLS オプションが用意されています。AWS のサービス クライアントが別の TLS プロバイダーを使用するには、aws_config クレートからローダーを使用して http_client をオーバーライドします。HTTP クライアントは、AWS のサービスおよび認証情報プロバイダーの両方に使用されます。

以下の例は、s2n-tls TLS プロバイダーの使用方法を示しています。ただし、同様の手法は他のプロバイダーに対しても有効です。

サンプルコードをコンパイルするには、以下のコマンドを実行して依存関係をプロジェクトに追加します。

cargo add aws-smithy-http-client -F s2n-tls

コード例:

use aws_smithy_http_client::{tls, Builder}; #[tokio::main] async fn main() { let http_client = Builder::new() .tls_provider(tls::Provider::S2nTls) .build_https(); let sdk_config = aws_config::defaults( aws_config::BehaviorVersion::latest() ) .http_client(http_client) .load() .await; // create client(s) using sdk_config // e.g. aws_sdk_s3::Client::new(&sdk_config); }

FIPS サポートの有効化

aws-smithy-http-client クレートには、FIPS 準拠の暗号化実装を有効化するオプションがあります。AWS のサービス クライアントが FIPS 準拠プロバイダーを使用するには、aws_config クレートからローダーを使用して http_client をオーバーライドします。HTTP クライアントは、AWS のサービスおよび認証情報プロバイダーの両方に使用されます。

注記

FIPS サポートには、ビルド環境で追加の依存関係が必要です。aws-lc クレートの「ビルド」手順を参照してください。

サンプルコードをコンパイルするには、以下のコマンドを実行して依存関係をプロジェクトに追加します。

cargo add aws-smithy-http-client -F rustls-aws-lc-fips

次のコード例では、FIPS のサポートを有効化しています。

// file: main.rs use aws_smithy_http_client::{ tls::{self, rustls_provider::CryptoMode}, Builder, }; #[tokio::main] async fn main() { let http_client = Builder::new() .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLcFips)) .build_https(); let sdk_config = aws_config::defaults( aws_config::BehaviorVersion::latest() ) .http_client(http_client) .load() .await; // create client(s) using sdk_config // e.g. aws_sdk_s3::Client::new(&sdk_config); }

ポスト量子キー交換の優先順位付け

デフォルトの TLS プロバイダーは、X25519MLKEM768 ポスト量子キー交換アルゴリズムをサポートする aws-lc-rs を使用する rustls に基づいています。最も優先度の高いアルゴリズムとして X25519MLKEM768 を作成するには、rustls パッケージをクレートに追加し、prefer-post-quantum 機能フラグを有効にする必要があります。それ以外の場合、使用はできますが、最優先ではありません。詳細については、rustls の「ドキュメント」を参照してください。

注記

これは、今後のリリースではデフォルトになります。

DNS リゾルバーのオーバーライド

デフォルトの DNS リゾルバーは、HTTP クライアントを手動で設定することによりオーバーライドできます。

サンプルコードをコンパイルするには、以下のコマンドを実行して依存関係をプロジェクトに追加します。

cargo add aws-smithy-http-client -F rustls-aws-lc cargo add aws-smithy-runtime-api -F client

次のコード例では、DNS リゾルバーをオーバーライドしています。

use aws_smithy_http_client::{ tls::{self, rustls_provider::CryptoMode}, Builder }; use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns}; use std::net::{IpAddr, Ipv4Addr}; /// A DNS resolver that returns a static IP address (127.0.0.1) #[derive(Debug, Clone)] struct StaticResolver; impl ResolveDns for StaticResolver { fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> { DnsFuture::ready(Ok(vec![IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))])) } } #[tokio::main] async fn main() { let http_client = Builder::new() .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLc)) .build_with_resolver(StaticResolver); let sdk_config = aws_config::defaults( aws_config::BehaviorVersion::latest() ) .http_client(http_client) .load() .await; // create client(s) using sdk_config // e.g. aws_sdk_s3::Client::new(&sdk_config); }
注記

デフォルトでは、Amazon Linux 2023 (AL2023) はオペレーティングシステムレベルで DNS キャッシュを行いません。

ルート CA 証明書のカスタマイズ

デフォルトでは、TLS プロバイダーは指定されたプラットフォームのシステムネイティブルート証明書を読み込みます。この動作をカスタマイズしてカスタム CA バンドルを読み込むには、独自の TlsContext を使用して TrustStore を設定できます。

サンプルコードをコンパイルするには、以下のコマンドを実行して依存関係をプロジェクトに追加します。

cargo add aws-smithy-http-client -F rustls-aws-lc

次の例では、rustlsaws-lc を使用しますが、サポートされているすべての TLS プロバイダーで機能します。

use aws_smithy_http_client::{ tls::{self, rustls_provider::CryptoMode}, Builder }; use std::fs; /// read the PEM encoded root CA (bundle) and return a custom TLS context fn tls_context_from_pem(filename: &str) -> tls::TlsContext { let pem_contents = fs::read(filename).unwrap(); // Create a new empty trust store (this will not load platform native certificates) let trust_store = tls::TrustStore::empty() .with_pem_certificate(pem_contents.as_slice()); tls::TlsContext::builder() .with_trust_store(trust_store) .build() .expect("valid TLS config") } #[tokio::main] async fn main() { let http_client = Builder::new() .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLc)) .tls_context(tls_context_from_pem("my-custom-ca.pem")) .build_https(); let sdk_config = aws_config::defaults( aws_config::BehaviorVersion::latest() ) .http_client(http_client) .load() .await; // create client(s) using sdk_config // e.g. aws_sdk_s3::Client::new(&sdk_config); }