Skip to content

Commit 2ece2bc

Browse files
committed
feat(router): TLS support
1 parent 5f17d4b commit 2ece2bc

17 files changed

Lines changed: 1076 additions & 94 deletions

File tree

Cargo.lock

Lines changed: 150 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ tokio = { version = "1.47.1", features = ["full"] }
6666
tokio-util = { version = "0.7.16" }
6767
rand = "0.10.0"
6868
jsonwebtoken = { version = "10.3.0", features = ["rust_crypto"] }
69-
ntex = { version = "3.4.0", features = ["tokio"] }
69+
ntex = { version = "3.4.0", features = ["tokio", "rustls"] }
7070
tonic = { version = "0.14.2", features = ["tls-aws-lc"] }
7171
reqwest = { version = "0.12.23", default-features = false, features = ["http2", "rustls-tls"] }
7272
reqwest-retry = "0.8.0"

bin/router/src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use hive_router_config::RouterConfigError;
2+
use hive_router_plan_executor::executors::error::TlsCertificatesError;
23

34
use crate::{
45
jwt::jwks_manager::JwksSourceError, pipeline::usage_reporting::UsageReportingError,
@@ -32,4 +33,6 @@ pub enum RouterInitError {
3233
endpoint_name_two: String,
3334
endpoint: String,
3435
},
36+
#[error(transparent)]
37+
TlsCertificatesError(#[from] TlsCertificatesError),
3538
}

bin/router/src/lib.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ pub use sonic_rs;
7070
pub use tokio;
7171
pub use tracing;
7272
use tracing::{info, warn, Instrument};
73+
pub mod tls;
7374

7475
static GRAPHIQL_HTML: &str = include_str!("../static/graphiql.html");
7576

@@ -188,7 +189,7 @@ pub async fn router_entrypoint(plugin_registry: PluginRegistry) -> Result<(), Ro
188189
paths.detect_conflicts(&prometheus)?;
189190

190191
let graphql_path = graphql_path.to_string();
191-
let maybe_error = web::HttpServer::new(async move || {
192+
let server = web::HttpServer::new(async move || {
192193
let landing_page_path = graphql_path.clone();
193194
let prometheus = prometheus.clone();
194195
web::App::new()
@@ -199,9 +200,22 @@ pub async fn router_entrypoint(plugin_registry: PluginRegistry) -> Result<(), Ro
199200
.default_service(web::to(move || {
200201
landing_page_handler(landing_page_path.clone())
201202
}))
202-
})
203-
.bind(&addr)
204-
.map_err(|err| RouterInitError::HttpServerBindError(addr, err))?
203+
});
204+
205+
let tls_config = shared_state_clone
206+
.router_config
207+
.traffic_shaping
208+
.router
209+
.tls
210+
.as_ref();
211+
212+
let maybe_error = if let Some(tls_config) = tls_config {
213+
let rustls_config = tls::build_rustls_config(tls_config)?;
214+
server.bind_rustls(&addr, &rustls_config)
215+
} else {
216+
server.bind(&addr)
217+
}
218+
.map_err(|err| RouterInitError::HttpServerBindError(addr.to_string(), err))?
205219
.run()
206220
.await
207221
.map_err(RouterInitError::HttpServerStartError);

bin/router/src/tls.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use std::sync::Arc;
2+
3+
use hive_router_config::traffic_shaping::ServerTLSConfig;
4+
use hive_router_plan_executor::executors::{
5+
error::TlsCertificatesError, map::from_cert_file_config_to_certificate_der,
6+
};
7+
use rustls::{
8+
pki_types::{pem::PemObject, PrivateKeyDer},
9+
server::{NoClientAuth, WebPkiClientVerifier},
10+
RootCertStore, ServerConfig,
11+
};
12+
13+
pub fn build_rustls_config(
14+
tls_config: &ServerTLSConfig,
15+
) -> Result<ServerConfig, TlsCertificatesError> {
16+
let client_auth = if let Some(client_auth_config) = tls_config.client_auth.as_ref() {
17+
let certs = from_cert_file_config_to_certificate_der(&client_auth_config.cert_file)?;
18+
let mut roots = RootCertStore::empty();
19+
roots.add_parsable_certificates(certs);
20+
WebPkiClientVerifier::builder(roots.into()).build()?
21+
} else {
22+
Arc::new(NoClientAuth)
23+
};
24+
let certs = from_cert_file_config_to_certificate_der(&tls_config.cert_file)?;
25+
let key = PrivateKeyDer::from_pem_file(&tls_config.key_file.absolute)
26+
.map_err(|err| TlsCertificatesError::CustomTlsCertificatesError("key_file", err))?;
27+
Ok(ServerConfig::builder()
28+
.with_client_cert_verifier(client_auth)
29+
.with_single_cert(certs, key)?)
30+
}

0 commit comments

Comments
 (0)