cert stuff
This commit is contained in:
+8
-3
@@ -9,11 +9,16 @@ use rcgen::{CertifiedKey, generate_simple_self_signed};
|
|||||||
use ring::digest;
|
use ring::digest;
|
||||||
use rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer};
|
use rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer};
|
||||||
|
|
||||||
/// Shared transport config: long idle timeout + keep-alive.
|
/// Shared transport config: very long idle timeout + frequent keep-alive.
|
||||||
|
///
|
||||||
|
/// Keep-alive is set well under the idle timeout so QUIC sends PING frames
|
||||||
|
/// before any NAT/firewall along the path prunes the UDP mapping. The idle
|
||||||
|
/// timeout itself is set to ~1h so even in the unlikely event a keep-alive
|
||||||
|
/// gets dropped, a single retry still recovers.
|
||||||
fn transport_config() -> TransportConfig {
|
fn transport_config() -> TransportConfig {
|
||||||
let mut transport = TransportConfig::default();
|
let mut transport = TransportConfig::default();
|
||||||
transport.max_idle_timeout(Some(Duration::from_secs(300).try_into().unwrap()));
|
transport.max_idle_timeout(Some(Duration::from_secs(3600).try_into().unwrap()));
|
||||||
transport.keep_alive_interval(Some(Duration::from_secs(5)));
|
transport.keep_alive_interval(Some(Duration::from_secs(10)));
|
||||||
transport.max_concurrent_bidi_streams(VarInt::from_u32(4096));
|
transport.max_concurrent_bidi_streams(VarInt::from_u32(4096));
|
||||||
transport
|
transport
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ async fn handle_connection(
|
|||||||
let state = state.clone();
|
let state = state.clone();
|
||||||
let conn = connection.clone();
|
let conn = connection.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
conn.closed().await;
|
let reason = conn.closed().await;
|
||||||
info!(%remote, "connection closed, cleaning up");
|
info!(%remote, "QUIC connection closed: {reason}");
|
||||||
state.remove_connection(connection_id);
|
state.remove_connection(connection_id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,13 @@ pub struct TraefikRouter {
|
|||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct TraefikTls {
|
pub struct TraefikTls {
|
||||||
cert_resolver: String,
|
cert_resolver: String,
|
||||||
|
domains: Vec<TraefikTlsDomain>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub struct TraefikTlsDomain {
|
||||||
|
main: String,
|
||||||
|
sans: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
@@ -91,6 +98,10 @@ async fn handler(State(state): State<Arc<ServerState>>) -> Json<TraefikConfig> {
|
|||||||
entry_points: vec![state.traefik_entrypoint.clone()],
|
entry_points: vec![state.traefik_entrypoint.clone()],
|
||||||
tls: state.traefik_cert_resolver.as_ref().map(|r| TraefikTls {
|
tls: state.traefik_cert_resolver.as_ref().map(|r| TraefikTls {
|
||||||
cert_resolver: r.clone(),
|
cert_resolver: r.clone(),
|
||||||
|
domains: vec![TraefikTlsDomain {
|
||||||
|
main: state.base_domain.clone(),
|
||||||
|
sans: vec![format!("*.{}", state.base_domain)],
|
||||||
|
}],
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user