本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
適用於 Rust 的 AWS SDK 提供內建 HTTP 功能,供您 AWS 服務 在程式碼中建立的用戶端使用。
根據預設,適用於 Rust 的 SDK 會使用基於 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。在任何平台上使用「fips」功能建置 需要 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 提供者是以 為基礎aws-lc-rs
,rustls
其支援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);
}