17 个版本 (10 个重大更新)
0.12.1 | 2024 年 7 月 3 日 |
---|---|
0.11.0 | 2024 年 1 月 7 日 |
0.9.1 | 2023 年 11 月 4 日 |
0.5.0 | 2023 年 2 月 17 日 |
0.1.3 | 2022 年 7 月 7 日 |
#196 在 网络编程
每月 679 次下载
120KB
2.5K SLoC
嵌入式设备 HTTP 客户端
reqwless
crate 实现了一个 HTTP 客户端,可以在不依赖 no_std
环境的情况下使用,任何实现了 embedded-io
crate 特性的传输都可以使用。无需分配或 std 库!
它提供了两组 API
- 一个低级的
request
API,允许您构建 HTTP 请求并将它们写入embedded-io
传输。 - 一个高级的
client
API,使用embedded-nal-async
(+ 可选的embedded-tls
/esp-mbedtls
) crate 建立 TCP + TLS 连接。
示例
let url = format!("https://127.0.0.1", addr.port());
let mut client = HttpClient::new(TokioTcp, StaticDns); // Types implementing embedded-nal-async
let mut rx_buf = [0; 4096];
let response = client
.request(Method::POST, &url)
.await
.unwrap()
.body(b"PING")
.content_type(ContentType::TextPlain)
.send(&mut rx_buf)
.await
.unwrap();
客户端仍然缺少许多功能,但可以执行带有有效负载的基本 HTTP GET/PUT/POST/DELETE 请求。但是,并非所有内容类型和状态码都已实现,并且根据需要添加。对于 TLS,它使用 embedded-tls
或 esp-mbedtls
作为传输。
注意:在 no_std
环境中不支持 embedded-tls
的 TLS 验证。
如果您缺少某个功能或希望进行改进,请提出问题或 PR。
TLS 1.2*, 1.3 和支持的加密套件
reqwless
使用 embedded-tls
或 esp-mbedtls
建立 https://..
urls 的安全 TLS 连接。
*TLS 1.2 只支持 esp-mbedtls
⚠️ 注意,这两个功能不能同时使用,否则会导致编译错误。
⚠️ reqwless
的发布版本不支持 esp-mbedtls
。这是因为 esp-mbedtls
尚未发布到 crates.io。应将 reqwless
指定为一个 git 依赖项以使用 esp-mbedtls
。
esp-mbedtls
仅适用于esp32板 esp-mbedtls
支持 TLS 1.2 和 1.3。它使用乐鑫科技的 Rust 包装器覆盖 mbedtls,并具备硬件加速等优化。
使用时,您需要为您的 SoC 启用 esp-mbedtls
的传递依赖。目前,支持的平台包括
esp32
esp32c3
esp32s2
esp32s3
Cargo.toml
reqwless = { version = "0.12.0", default-features = false, features = ["esp-mbedtls", "log"] }
esp-mbedtls = { git = "https://github.com/esp-rs/esp-mbedtls.git", features = ["esp32s3"] }
示例
/// ... [initialization code. See esp-wifi]
let state = TcpClientState::<1, 4096, 4096>::new();
let mut tcp_client = TcpClient::new(stack, &state);
let dns_socket = DnsSocket::new(&stack);
let mut rsa = Rsa::new(peripherals.RSA);
let config = TlsConfig::new(
reqwless::TlsVersion::Tls1_3,
reqwless::Certificates {
ca_chain: reqwless::X509::pem(CERT.as_bytes()).ok(),
..Default::default()
},
Some(&mut rsa), // Will use hardware acceleration
);
let mut client = HttpClient::new_with_tls(&tcp_client, &dns_socket, config);
let mut request = client
.request(reqwless::request::Method::GET, "https://www.google.com")
.await
.unwrap()
.content_type(reqwless::headers::ContentType::TextPlain)
.headers(&[("Host", "google.com")])
.send(&mut buffer)
.await
.unwrap();
嵌入式-tls
嵌入式-tls
仅支持 TLS 1.3,因此要建立连接,服务器必须启用此 ssl 协议。
除了 TLS 版本要求外,在客户端和服务器之间建立安全通信的过程中,还需要协商支持算法。默认情况下,嵌入式-tls
中支持的算法集合仅限于可以在堆栈上完全运行的算法。要测试服务器是否支持此有限算法集,请使用以下 openssl
命令进行测试
openssl s_client -tls1_3 -ciphersuites TLS_AES_128_GCM_SHA256 -sigalgs "ECDSA+SHA256:ECDSA+SHA384:ed25519" -connect hostname:443
如果服务器成功回复客户端的 hello 消息,则服务器上启用的 TLS 版本和算法应该正常。如果命令失败,请尝试不使用有限签名算法集运行
openssl s_client -tls1_3 -ciphersuites TLS_AES_128_GCM_SHA256 -connect hostname:443
如果这样做可行,那么有两种选择。或者通过将私钥从 RSA 更改为 ECDSA 或 ed25519 来在服务器上启用签名算法,或者通过指定 alloc
功能在客户端启用 RSA 密钥。这将启用 alloc
在 嵌入式-tls
中,从而启用 RSA 签名算法。
最低支持的 Rust 版本 (MSRV)
reqwless
可以在稳定 Rust 1.75 及以上版本编译。
依赖项
~6.5MB
~121K SLoC