

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在適用於 Rust 的 AWS SDK 中設定 HTTP 層級設定
<a name="http"></a>

 適用於 Rust 的 AWS SDK 提供內建 HTTP 功能，可供 AWS 服務 您在程式碼中建立的用戶端使用。

根據預設，適用於 Rust 的 開發套件會使用基於 `hyper`、 `rustls`和 的 HTTPS 用戶端`aws-lc-rs`。此用戶端應適用於大多數使用案例，無需其他組態。
+ [https://docs.rs/hyper/latest/hyper/](https://docs.rs/hyper/latest/hyper/) 是 Rust 的較低層級 HTTP 程式庫，可與 搭配使用 適用於 Rust 的 AWS SDK ，以進行 API 服務呼叫。
+ [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/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs)進行密碼編譯[https://github.com/rustls/rustls](https://github.com/rustls/rustls)的 TLS 提供者。  
這是 SDK for Rust 的預設 HTTP 行為。如果您想要使用此選項，您不需要在程式碼中採取任何其他動作。

**`s2n-tls`**  
以 為基礎的 TLS 提供者[https://github.com/aws/s2n-tls](https://github.com/aws/s2n-tls)。

**`rustls` 取代為 `aws-lc-fips`**  
以 為基礎的 TLS 提供者[https://github.com/rustls/rustls](https://github.com/rustls/rustls)，使用符合 FIPS 的 版本[https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs)進行密碼編譯

**`rustls` 取代為 `ring`**  
使用 [https://github.com/briansmith/ring](https://github.com/briansmith/ring)進行密碼編譯[https://github.com/rustls/rustls](https://github.com/rustls/rustls)的 TLS 提供者。

### 先決條件
<a name="prereqTls"></a>

使用 `aws-lc-rs`或 `s2n-tls`需要 C 編譯器 (Clang 或 GCC) 才能建置。對於某些平台，建置也可能需要 CMake。在任何平台上使用「光纖」功能建置 需要 CMake 和 Go。如需詳細資訊，請參閱 [AWS Libcrypto for Rust (`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 提供者，`http_client`請使用 條`aws_config`箱中的載入器覆寫 。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 提供者是以`rustls`使用 為基礎`aws-lc-rs`，支援`X25519MLKEM768`後量子金鑰交換演算法。若要讓 成為`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>

 手動設定 HTTP 用戶端可以覆寫預設 DNS 解析程式。

若要編譯範例程式碼，請執行下列命令，將相依性新增至您的專案：

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