3 个版本 (破坏性更新)
0.3.0 | 2024年5月19日 |
---|---|
0.2.0 | 2024年2月4日 |
0.1.0 | 2024年1月31日 |
#667 在 密码学
每月下载 127 次
在 5 个crate 中使用
32KB
111 行
rustls-channel-resolver
一个简单的类似通道的解析器,用于实时重新加载 TLS 证书
使用方法
将依赖项添加到您的项目中
cargo add rustls-channel-resolver
配置您的证书文件的实时重新加载
use std::time::Duration;
use actix_web::{web, App, HttpServer};
async fn index() -> &'static str {
"Hewwo Mr Obama"
}
#[actix_web::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let initial_key = read_key().await?.unwrap();
let (tx, rx) = rustls_channel_resolver::channel::<32>(initial_key);
let handle = actix_web::rt::spawn(async move {
let mut interval = actix_web::rt::time::interval(Duration::from_secs(30));
interval.tick().await;
loop {
interval.tick().await;
match read_key().await {
Ok(Some(key)) => tx.update(key),
Ok(None) => eprintln!("No key in keyfile"),
Err(e) => {
eprintln!("Failed to read key from fs {e}");
}
}
}
});
let server_config = rustls::ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth()
.with_cert_resolver(rx);
HttpServer::new(|| App::new().route("/", web::get().to(index)))
.bind_rustls_0_22("0.0.0.0:8443", server_config)?
.bind("0.0.0.0:8080")?
.run()
.await?;
handle.abort();
let _ = handle.await;
Ok(())
}
async fn read_key() -> Result<Option<rustls::sign::CertifiedKey>, Box<dyn std::error::Error>> {
let cert_bytes = tokio::fs::read("./out/example.crt").await?;
let certs = rustls_pemfile::certs(&mut cert_bytes.as_slice())
.collect::<Result<Vec<_>, _>>()?;
let key_bytes = tokio::fs::read("./out/example.key").await?;
let Some(private_key) = rustls_pemfile::private_key(&mut key_bytes.as_slice())? else {
return Ok(None);
};
let private_key =
rustls::crypto::ring::sign::any_supported_type(&private_key)?;
Ok(Some(rustls::sign::CertifiedKey::new(certs, private_key)))
}
贡献
您可以随意为任何您发现的问题提出问题。请注意,任何贡献的代码都将根据 AGPLv3 许可。
许可证
版权所有 © 2024 asonix
rustls-channel-resolver 是免费软件:您可以重新分发它并/或修改它,前提是遵守由自由软件基金会发布的 GNU Affero 通用公共许可证的条款,即许可证的第 3 版,或者(根据您的选择)许可证的任何较新版本。
rustls-channel-resolver 是以希望它将是有用的方式分发的,但没有任何保证;甚至没有关于其商销性或适用于特定目的的隐含保证。有关详细信息,请参阅 GNU Affero 通用公共许可证。此文件是 rustls-channel-resolver 的一部分。
您应该已随 rustls-channel-resolver 一起收到 GNU Affero 通用公共许可证的副本。如果没有,请参阅 http://www.gnu.org/licenses/。
依赖项
~7–16MB
~267K SLoC