在適用於 Rust 的 AWS SDK 中設定 HTTP 層級設定 - 適用於 Rust 的 AWS SDK

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

在適用於 Rust 的 AWS SDK 中設定 HTTP 層級設定

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

根據預設,適用於 Rust 的 開發套件會使用基於 hyperrustls和 的 HTTPS 用戶端aws-lc-rs。此用戶端應適用於大多數使用案例,無需其他組態。

  • hyper 是 Rust 的較低層級 HTTP 程式庫,可與 搭配使用 適用於 Rust 的 AWS SDK ,以進行 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 提供者。

下列供應商可供使用:

rustls 取代為 aws-lc

使用 aws-lc-rs進行密碼編譯rustls的 TLS 提供者。

這是 SDK for Rust 的預設 HTTP 行為。如果您想要使用此選項,您不需要在程式碼中採取任何其他動作。

s2n-tls

以 為基礎的 TLS 提供者s2n-tls

rustls 取代為 aws-lc-fips

以 為基礎的 TLS 提供者rustls,使用符合 FIPS 的 版本aws-lc-rs進行密碼編譯

rustls 取代為 ring

使用 ring進行密碼編譯rustls的 TLS 提供者。

先決條件

使用 aws-lc-rss2n-tls需要 C 編譯器 (Clang 或 GCC) 才能建置。對於某些平台,建置也可能需要 CMake。在任何平台上使用「光纖」功能建置 需要 CMake 和 Go。如需詳細資訊,請參閱 AWS Libcrypto for Rust (aws-lc-rs) 儲存庫和建置說明。

如何使用替代 TLS 提供者

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 支援

aws-smithy-http-client 木箱提供啟用 FIPS 相容加密實作的選項。若要讓您的 AWS 服務 用戶端使用符合 FIPS 規範的提供者,http_client請使用 條aws_config箱中的載入器覆寫 。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 提供者是以rustls使用 為基礎aws-lc-rs,支援X25519MLKEM768後量子金鑰交換演算法。若要讓 成為X25519MLKEM768最高優先順序的演算法,您需要將rustls套件新增至您的木箱,並啟用prefer-post-quantum功能旗標。否則,它可用,但不是最高優先順序。如需詳細資訊,請參閱 rustls 文件

注意

這將成為未來版本的預設值。

覆寫 DNS 解析程式

手動設定 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 憑證

根據預設,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); }