本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在適用於 Rust 的 AWS SDK 中設定 HTTP 層級設定
適用於 Rust 的 AWS SDK 提供內建 HTTP 功能,可供 AWS 服務 您在程式碼中建立的用戶端使用。
根據預設,適用於 Rust 的 開發套件會使用基於 hyper
、 rustls
和 的 HTTPS 用戶端aws-lc-rs
。此用戶端應適用於大多數使用案例,無需其他組態。
如果您想要選擇不同的 TLS 或密碼編譯供應商,aws-smithy-http-client
則條板箱會提供一些額外的選項和組態。對於更進階的使用案例,建議您使用自己的 HTTP 用戶端實作或提交功能請求以供考量。
選擇替代的 TLS 提供者
aws-smithy-http-client
木箱提供一些替代的 TLS 提供者。
下列供應商可供使用:
先決條件
使用 aws-lc-rs
或 s2n-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); }