

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

# AWS SDK for Rust 内での HTTP レベルの設定の構成
<a name="http"></a>

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

デフォルトでは、SDK for Rust は `hyper`、`rustls`、および `aws-lc-rs` に基づく HTTPS クライアントを使用します。このクライアントは、追加の設定なしでほとんどのユースケースで問題なく機能します。
+ [https://docs.rs/hyper/latest/hyper/](https://docs.rs/hyper/latest/hyper/) は Rust 用の低レベルの HTTP ライブラリで、 で API サービスコール AWS SDK for Rust を行うことができます。
+ [https://github.com/rustls/rustls](https://github.com/rustls/rustls) は、Rust で記述された最新の TLS ライブラリで、暗号化プロバイダー用のオプションが組み込まれています。
+ [https://github.com/aws/aws-lc](https://github.com/aws/aws-lc) は、TLS および一般的なアプリケーションに必要なアルゴリズムを含む汎用暗号化ライブラリです。
+ [https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs) は、Rust の `aws-lc` ライブラリに対する慣用的なラッパーです。

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

## 代替 TLS プロバイダーの選択
<a name="tlsProviders"></a>

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

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

**`rustls` に `aws-lc` を使用する**  
[https://github.com/rustls/rustls](https://github.com/rustls/rustls) に基づく TLS プロバイダーで、暗号化に [https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs) を使用します。  
これは、SDK for Rust のデフォルトの HTTP 動作です。このオプションを使用する場合、コードで追加のアクションを実行する必要はありません。

**`s2n-tls`**  
[https://github.com/aws/s2n-tls](https://github.com/aws/s2n-tls) に基づく TLS プロバイダー。

**`rustls` に `aws-lc-fips` を使用する**  
[https://github.com/rustls/rustls](https://github.com/rustls/rustls) に基づく TLS プロバイダーで、暗号化に [https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs) の FIPS 準拠バージョンを使用します

**`rustls` に `ring` を使用する**  
[https://github.com/rustls/rustls](https://github.com/rustls/rustls) に基づく TLS プロバイダーで、暗号化に [https://github.com/briansmith/ring](https://github.com/briansmith/ring) を使用します。

### 前提条件
<a name="prereqTls"></a>

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

### 代替 TLS プロバイダーの使用方法
<a name="s2nTls"></a>

`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 サポートの有効化
<a name="fipsTls"></a>

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

**注記**  
FIPS サポートには、ビルド環境で追加の依存関係が必要です。`aws-lc` クレートの「[ビルド](https://github.com/aws/aws-lc/blob/main/BUILDING.md)」手順を参照してください。

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

```
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);
}
```

## ポスト量子キー交換の優先順位付け
<a name="quantumTls"></a>

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

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

## DNS リゾルバーのオーバーライド
<a name="overrideDns"></a>

 デフォルトの 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 証明書のカスタマイズ
<a name="customizeCertificatesTls"></a>

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

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

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

次の例では、`rustls` で `aws-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);
}
```