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
相关产品推荐
相关产品推荐

