40个版本 (10个重大更新)

0.11.1 2024年8月20日
0.10.1 2024年5月16日
0.9.2 2024年2月10日
0.8.1 2023年12月6日
0.1.4 2021年3月20日

#136 in 密码学

Download history 1061/week @ 2024-05-03 1011/week @ 2024-05-10 840/week @ 2024-05-17 1018/week @ 2024-05-24 1002/week @ 2024-05-31 1263/week @ 2024-06-07 1056/week @ 2024-06-14 1156/week @ 2024-06-21 1063/week @ 2024-06-28 1078/week @ 2024-07-05 847/week @ 2024-07-12 993/week @ 2024-07-19 1274/week @ 2024-07-26 958/week @ 2024-08-02 952/week @ 2024-08-09 1497/week @ 2024-08-16

每月4,884次下载
用于 19 个crate (13个直接使用)

Apache-2.0 OR MIT

85KB
1.5K SLoC

Documentation

使用rustls进行TLS证书管理和服务的库

许可

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证的定义,应按上述方式双许可,无需任何额外条款或条件。


lib.rs:

rustls-acme是一个易于使用的、与异步兼容的ACME客户端库,适用于rustls。所使用的验证机制是tls-alpn-01,它允许在同一端口上提供ACME挑战响应和常规TLS流量。

rustls-acme旨在实现运行时不敏感,尽可能独立于Rust当前的运行时。底层不会生成持久任务,证书获取/更新过程被整合到库用户轮询的流和future中。

目标是提供一个与Let's Encrypt兼容的TLS服务和证书管理,使用简单灵活的基于流的API。

要使用rustls-acme,请将以下行添加到您的Cargo.toml

[dependencies]
rustls-acme = "*"

高级API

高级API由一个传入的TLS连接流[Incoming]组成。轮询流的下一个future负责证书的获取和更新,以及接受TLS连接,在成功后将其传递给调用者。

use futures::prelude::*;
use rustls_acme::{AcmeConfig, caches::DirCache};

#[macro_rules_attribute::apply(smol_macros::main!)]
async fn main() {
    simple_logger::init_with_level(log::Level::Info).unwrap();

    let tcp_listener = smol::net::TcpListener::bind("[::]:443").await.unwrap();

    let mut tls_incoming = AcmeConfig::new(["example.com"])
        .contact_push("mailto:[email protected]")
        .cache(DirCache::new("./rustls_acme_cache"))
        .incoming(tcp_listener.incoming(), Vec::new());

    while let Some(tls) = tls_incoming.next().await {
        let mut tls = tls.unwrap();
        smol::spawn(async move {
            tls.write_all(HELLO).await.unwrap();
            tls.close().await.unwrap();
        }).detach();
    }
}

const HELLO: &'static [u8] = br#"HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain; charset=utf-8

Hello Tls!"#;

examples/high_level.rs实现了与上面类似的“Hello Tls!”服务器,该服务器接受域名、端口和缓存目录参数。

请注意,所有示例默认使用 Let's Encrypt 的测试目录。生产目录施加严格的速率限制,测试和开发期间容易意外耗尽。对于使用测试目录进行测试,您可以在允许与由不受信任的 CA 签名的服务器建立 TLS 连接的浏览器中打开 https://<你的域名>:<端口>(在 Firefox 中点击 "高级..." -> "接受风险并继续")。

低级 Rustls API

对于可能希望直接与 [rustls] 或 [futures_rustls] 交互的用户,库公开了底层的证书管理 [AcmeState],以及一个匹配的解析器 [ResolvesServerCertAcme],它实现了 rustls::server::ResolvesServerCert 特性。请参阅 server_low_level 示例,了解如何直接使用低级 API 与 [futures_rustls]。

账户和证书缓存

使用 Let's Encrypt 生产目录的生产服务器必须实现账户和证书缓存,以避免耗尽 Let's Encrypt API 的速率限制。通过 caches::DirCache 提供了基于文件的缓存,它使用缓存目录。可以使用 [Cache] 特性或底层的 [CertCache]、[AccountCache] 特性(欢迎贡献)实现由其他持久化层支持的缓存。caches::CompositeCache 提供了一个包装器,将两个 [CertCache] 和 [AccountCache] 的实现组合成一个 [Cache]。

请注意,缓存的错误类型参数通过 [AcmeConfig] 传递到本 crate 中的一些其他类型。如果您想避免基于缓存类型的不同特殊化,请使用 AcmeConfig::cache_with_boxed_err 方法构建 [AcmeConfig] 对象。

acme 模块

异步 acme 客户端的底层实现可能对其他人有用,并作为模块公开。它是不完整的(欢迎贡献)并且没有任何稳定性保证。

特别感谢

这个 crate 受到 autocert 包的启发,该包用于 Go

这个 crate 建立在 rustlsfutures-rustls 和许多其他人的优秀工作之上。

感谢 Josh Triplett 的贡献和反馈。

依赖项

~78MB
~2M SLoC