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网络编程

Download history 22/week @ 2024-05-03 17/week @ 2024-05-10 123/week @ 2024-05-17 108/week @ 2024-05-24 48/week @ 2024-05-31 39/week @ 2024-06-07 59/week @ 2024-06-14 107/week @ 2024-06-21 256/week @ 2024-06-28 121/week @ 2024-07-05 97/week @ 2024-07-12 119/week @ 2024-07-19 143/week @ 2024-07-26 174/week @ 2024-08-02 185/week @ 2024-08-09 149/week @ 2024-08-16

每月 679 次下载

Apache-2.0

120KB
2.5K SLoC

嵌入式设备 HTTP 客户端

CI crates.io docs.rs Matrix

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-tlsesp-mbedtls 作为传输。

注意:在 no_std 环境中不支持 embedded-tls 的 TLS 验证。

如果您缺少某个功能或希望进行改进,请提出问题或 PR。

TLS 1.2*, 1.3 和支持的加密套件

reqwless 使用 embedded-tlsesp-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