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 异步
7,690 每月下载量
用于 10 个crate (4 个直接使用)
83KB
2K SLoC
tokio-rustls-acme
一个易于使用、异步兼容的ACME客户端库,使用rustls和ring。使用的验证机制是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
对于可能希望直接与rustls
或tokio-rustls
交互的用户,该库公开了底层的证书管理AcmeState
以及一个匹配的解析器ResolvesServerCertAcme
,该解析器实现了rustls::server::ResolvesServerCert
特质。有关如何直接使用tokio-rustls
使用低级API的示例,请参阅server_low_level
示例。
账户和证书缓存
使用lets encrypt生产目录的生产服务器必须实现账户和证书缓存,以避免耗尽lets 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的。
本软件包的原始实现可在以下位置找到:FlorianUekermann/rustls-acme,这是一个仅关注支持tokio的版本。
此软件包还基于以下作者的杰出工作:rustls
、tokio-rustls
以及许多人。
许可证
本项目采用以下许可证之一:
- Apache许可证2.0版(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任您选择。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,均将按照上述方式双重许可,没有任何额外的条款或条件。
依赖项
~18–30MB
~564K SLoC