6个版本 (3个重大更改)

0.4.0 2024年8月12日
0.3.0 2024年4月10日
0.2.0 2023年8月22日
0.1.2 2023年6月27日
0.1.0 2023年5月22日

#109 in 异步

Download history 1087/week @ 2024-05-03 1389/week @ 2024-05-10 2242/week @ 2024-05-17 1382/week @ 2024-05-24 1830/week @ 2024-05-31 1407/week @ 2024-06-07 1599/week @ 2024-06-14 1605/week @ 2024-06-21 1904/week @ 2024-06-28 2299/week @ 2024-07-05 1482/week @ 2024-07-12 1966/week @ 2024-07-19 1991/week @ 2024-07-26 2140/week @ 2024-08-02 2046/week @ 2024-08-09 1209/week @ 2024-08-16

7,690 每月下载量
用于 10 个crate (4 个直接使用)

Apache-2.0 OR MIT

83KB
2K SLoC

tokio-rustls-acme

使用ring进行TLS证书管理的tokio-rustls-acme


基于https://github.com/FlorianUekermann/rustls-acme的原始实现。

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

设计用于使用tokio运行时,如果您需要支持其他运行时,请查看原始实现rustls-acme

底层不会产生持久任务,证书获取/更新过程被折叠到库用户正在轮询的流和future中。

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

该软件包使用ring作为rustls的后端,而不是aws-lc-rs。这通常使得编译更加容易。如果您希望使用aws-lc-rs作为rustls的后端,我们欢迎贡献包含必要的Cargo.toml更改和功能标志的贡献,以使您能够做到这一点。

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

[dependencies]
tokio-rustls-acme = "*"

高级API

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

use tokio::io::AsyncWriteExt;
use futures::StreamExt;
use tokio_rustls_acme::{AcmeConfig, caches::DirCache};
use tokio_stream::wrappers::TcpListenerStream;

#[tokio::main]
async fn main() {
    simple_logger::init_with_level(log::Level::Info).unwrap();

    let tcp_listener = tokio::net::TcpListener::bind("[::]:443").await.unwrap();
    let tcp_incoming = TcpListenerStream::new(tcp_listener);

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

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

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!”服务器,该服务器接受域名、端口和缓存目录参数。

请注意,所有示例默认使用lets encrypt的测试目录。生产目录强制实施严格的速率限制,这些限制在测试和开发过程中很容易意外耗尽。对于使用测试目录进行测试,您可以在允许由不受信任的CA签名的服务器进行TLS连接的浏览器中打开https://<your domain>:<port>(在Firefox中,点击“高级...” -> “接受风险并继续”)。

低级Rustls API

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

账户和证书缓存

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

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

acme模块

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

特别感谢

这个crate受到了autocert包的启发,该包是Go的。

本软件包的原始实现可在以下位置找到:FlorianUekermann/rustls-acme,这是一个仅关注支持tokio的版本。

此软件包还基于以下作者的杰出工作:rustlstokio-rustls以及许多人。

许可证

本项目采用以下许可证之一:

任您选择。

贡献

除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,均将按照上述方式双重许可,没有任何额外的条款或条件。

依赖项

~18–30MB
~564K SLoC