#tls-certificate #tls #rustls #actix-web #resolver #live-reloading #ruslts

rustls-channel-resolver

一个简单的单证书通道 rustls 解析器,用于实时重新加载证书文件

3 个版本 (破坏性更新)

0.3.0 2024年5月19日
0.2.0 2024年2月4日
0.1.0 2024年1月31日

#667密码学

Download history 16/week @ 2024-04-15 10/week @ 2024-04-22 34/week @ 2024-04-29 109/week @ 2024-05-13 98/week @ 2024-05-20 38/week @ 2024-05-27 87/week @ 2024-06-03 20/week @ 2024-06-10 49/week @ 2024-06-17 76/week @ 2024-06-24 42/week @ 2024-07-08 50/week @ 2024-07-15 13/week @ 2024-07-22 22/week @ 2024-07-29

每月下载 127 次
5 个crate 中使用

AGPL-3.0

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