You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Actix Web + rustls实现Let's Encrypt证书自动续期?

Actix Web + rustls 实现Let's Encrypt证书自动续期

核心方案:rustls_acme集成

rustls_acme适配rustls,支持TLS-ALPN-01验证、无停机证书热重载、多域名SAN证书,完全匹配你的需求,具体集成步骤如下:

1. 添加依赖

在Cargo.toml中补充依赖:

[dependencies]
actix-web = "4"
rustls = "0.21"
rustls_acme = "0.10"
tokio = { version = "1", features = ["full"] }

2. 替换静态rustls配置为动态ACME证书提供者

rustls_acme的AcmeConfig会自动处理证书申请、续期,并生成适配Actix Web的rustls ServerConfig,同时后台运行续期任务,无需重启服务器。修改你的main函数:

use actix_web::{web, App, HttpServer, middleware};
use rustls_acme::{AcmeConfig, persist::FilePersist};
use std::sync::Arc;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let (i_cfg, app_data) = init().expect("Server initialization FAILED!");
    let _log = init_logger(&i_cfg).expect("Logger Initialisation Failed!");

    let state = web::Data::new(app_data);

    // 初始化ACME配置,替换为你的域名和联系邮箱
    let acme_config = AcmeConfig::new(["your-primary-domain.com", "secondary-domain.com"])
        .contact(["mailto:your-email@example.com"])
        .persist(Arc::new(FilePersist::new("./cert-storage"))) // 本地存储证书路径
        .directory_lets_encrypt(true); // 生产环境用true,测试用false(staging环境)

    // 生成rustls ServerConfig并启动自动续期任务
    let (server_config, acme_actor) = acme_config.rustls_server_config().await?;
    tokio::spawn(acme_actor.run());

    return HttpServer::new(move || {
        App::new()
            .wrap(middleware::Compress::default())
            .app_data(state.clone())
            .route("/api/time", web::get().to(time))
            .route("/api/echo", web::get().to(echo))
            .route("/api/ship", web::get().to(ship))
            .default_service(web::get().to(not_found))
    })
    .bind_rustls(i_cfg.ip_port, server_config)?
    .workers(i_cfg.workers)
    .run()
    .await;
}

3. 关键特性说明

  • 无停机续期:rustls_acme会在证书过期前自动续期,新证书热加载到rustls配置中,已建立的连接不受影响,新连接立即使用新证书。
  • 多域名支持:在AcmeConfig::new()中传入多个域名即可申请包含所有域名的SAN证书,续期时自动同步更新。
  • TLS-ALPN-01验证:默认启用该验证方式,无需额外配置HTTP路由,直接通过443端口完成Let's Encrypt的验证流程。
  • 证书持久化:FilePersist将证书存储到本地目录,避免每次重启服务器都重新申请证书,减少Let's Encrypt API调用次数。

关于Actix专用ACME crate

目前没有专门针对Actix Web开发的ACME自动续期crate,rustls_acme是最优选择——它直接适配rustls,而Actix Web原生支持rustls作为TLS后端,集成成本最低,功能完全满足需求。

注意事项

  • 确保服务器443端口对外开放,TLS-ALPN-01验证需要该端口可被Let's Encrypt的验证服务器访问。
  • 测试阶段建议使用Let's Encrypt的staging环境(将directory_lets_encrypt(true)改为false),避免触发生产环境的证书申请频率限制。
  • 首次运行时,rustls_acme会自动注册Let's Encrypt账号,确保服务器能访问Let's Encrypt的API地址。

内容的提问来源于stack exchange,提问作者Mindxxxd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:35:32