feat(gateway): Add server-side TLS support (#15052)
This commit is contained in:
@@ -14,6 +14,7 @@ use axum::{
|
||||
routing::{delete, get, post},
|
||||
serve, Json, Router,
|
||||
};
|
||||
use rustls::crypto::ring;
|
||||
use serde::Deserialize;
|
||||
use serde_json::{json, Value};
|
||||
use tokio::{net::TcpListener, signal, spawn};
|
||||
@@ -983,13 +984,45 @@ pub async fn startup(config: ServerConfig) -> Result<(), Box<dyn std::error::Err
|
||||
// TcpListener::bind accepts &str and handles IPv4/IPv6 via ToSocketAddrs
|
||||
let bind_addr = format!("{}:{}", config.host, config.port);
|
||||
info!("Starting server on {}", bind_addr);
|
||||
let listener = TcpListener::bind(&bind_addr)
|
||||
.await
|
||||
.map_err(|e| format!("Failed to bind to {}: {}", bind_addr, e))?;
|
||||
serve(listener, app)
|
||||
.with_graceful_shutdown(shutdown_signal())
|
||||
.await
|
||||
.map_err(|e| Box::new(e) as Box<dyn std::error::Error>)?;
|
||||
|
||||
if let (Some(cert), Some(key)) = (
|
||||
&config.router_config.server_cert,
|
||||
&config.router_config.server_key,
|
||||
) {
|
||||
info!("TLS enabled");
|
||||
ring::default_provider()
|
||||
.install_default()
|
||||
.map_err(|e| format!("Failed to install rustls ring provider: {e:?}"))?;
|
||||
|
||||
let tls_config = axum_server::tls_rustls::RustlsConfig::from_pem(cert.clone(), key.clone())
|
||||
.await
|
||||
.map_err(|e| format!("Failed to create TLS config: {}", e))?;
|
||||
|
||||
let addr: std::net::SocketAddr = bind_addr
|
||||
.parse()
|
||||
.map_err(|e| format!("Invalid address: {}", e))?;
|
||||
|
||||
let handle = axum_server::Handle::new();
|
||||
let handle_clone = handle.clone();
|
||||
spawn(async move {
|
||||
shutdown_signal().await;
|
||||
handle_clone.graceful_shutdown(None);
|
||||
});
|
||||
|
||||
axum_server::bind_rustls(addr, tls_config)
|
||||
.handle(handle)
|
||||
.serve(app.into_make_service())
|
||||
.await
|
||||
.map_err(|e| Box::new(e) as Box<dyn std::error::Error>)?;
|
||||
} else {
|
||||
let listener = TcpListener::bind(&bind_addr)
|
||||
.await
|
||||
.map_err(|e| format!("Failed to bind to {}: {}", bind_addr, e))?;
|
||||
serve(listener, app)
|
||||
.with_graceful_shutdown(shutdown_signal())
|
||||
.await
|
||||
.map_err(|e| Box::new(e) as Box<dyn std::error::Error>)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user