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 密码学
每月4,884次下载
用于 19 个crate (13个直接使用)
85KB
1.5K SLoC
使用rustls进行TLS证书管理和服务的库
许可
许可协议为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据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 建立在 rustls、futures-rustls 和许多其他人的优秀工作之上。
感谢 Josh Triplett 的贡献和反馈。
依赖项
~78MB
~2M SLoC