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

Axum配置TLS:如何指定证书与密钥路径?

Axum中配置HTTPS证书与密钥的方案

一、替代停止维护的axum-server:使用官方生态依赖

axum-server已归档停止维护,不建议继续使用。Axum基于Hyper,官方推荐直接结合Hyper + hyper-rustls实现HTTPS配置,完全可以替代axum-server的功能,且依赖维护更可靠。

二、实现类似Rocket.toml的配置文件读取

你可以通过config库加载自定义的TOML配置文件(比如命名为config.toml),读取证书和密钥路径,再通过hyper-rustls加载证书启动服务。

步骤1:添加依赖

在Cargo.toml中加入所需依赖:

[dependencies]
axum = "0.7"
hyper = { version = "1.1", features = ["full"] }
hyper-rustls = "0.24"
rustls-pemfile = "1.0"
config = "0.14"
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.0", features = ["full"] }

步骤2:编写配置文件

创建config.toml,配置服务地址、证书和密钥路径:

[server]
addr = "0.0.0.0:443"
cert_path = "./ssl/cert.pem"
key_path = "./ssl/key.pem"

步骤3:编写代码加载配置并启动HTTPS服务

use axum::{routing::get, Router};
use config::Config;
use hyper::server::conn::AddrIncoming;
use hyper_rustls::TlsAcceptor;
use rustls_pemfile::{certs, pkcs8_private_keys};
use serde::Deserialize;
use std::{fs::File, io::BufReader, net::SocketAddr};

// 定义配置结构体,对应config.toml的结构
#[derive(Debug, Deserialize)]
struct ServerConfig {
    addr: SocketAddr,
    cert_path: String,
    key_path: String,
}

#[derive(Debug, Deserialize)]
struct AppConfig {
    server: ServerConfig,
}

#[tokio::main]
async fn main() {
    // 加载并解析配置文件
    let config = Config::builder()
        .add_source(config::File::with_name("config.toml"))
        .build()
        .expect("Failed to load config file");
    let app_config: AppConfig = config.try_deserialize().expect("Failed to parse config");
    let server_config = app_config.server;

    // 加载证书文件
    let cert_file = File::open(&server_config.cert_path).expect("Failed to open cert file");
    let mut cert_reader = BufReader::new(cert_file);
    let certs = certs(&mut cert_reader)
        .expect("Failed to parse certs")
        .into_iter()
        .map(|cert| rustls::Certificate(cert))
        .collect();

    // 加载私钥文件(仅支持PKCS#8格式)
    let key_file = File::open(&server_config.key_path).expect("Failed to open key file");
    let mut key_reader = BufReader::new(key_file);
    let keys = pkcs8_private_keys(&mut key_reader).expect("Failed to parse private key");
    let key = rustls::PrivateKey(keys[0].clone());

    // 构建TLS配置
    let tls_config = rustls::ServerConfig::builder()
        .with_safe_defaults()
        .with_no_client_auth()
        .with_single_cert(certs, key)
        .expect("Failed to build TLS config");

    // 构建TLS acceptor
    let tls_acceptor = TlsAcceptor::from(std::sync::Arc::new(tls_config));

    // 构建Axum路由
    let app = Router::new().route("/", get(|| async { "Hello, HTTPS!" }));

    // 绑定地址并启动HTTPS服务
    let incoming = AddrIncoming::bind(&server_config.addr).expect("Failed to bind address");
    let server = hyper::Server::builder(tls_acceptor.accept_with(incoming))
        .serve(app.into_make_service());

    println!("HTTPS server running on https://{}", server_config.addr);
    server.await.expect("Server failed to run");
}

三、关于你遇到的axum-server依赖错误

axum-server依赖的aws-lc-sys编译错误,是因为该库需要编译x86_64汇编代码,你的环境缺少NASM汇编器。解决需要安装NASM并添加到系统PATH,但由于axum-server已停止维护,更建议直接切换到上面的官方方案,避免后续潜在的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:26