EpicGames/lore · error · anyhow::Error
Missing QUIC certificate config
Error message
Missing QUIC certificate config
What it means
launch_quinn_server needs TLS certificates for QUIC: either an explicitly configured certificate or, when allowed, an auto-generated ephemeral one. If quic_settings.certificate is None and ephemeral generation is not enabled, startup fails with this error.
Solutions
- Add the certificate (and key) settings under the QUIC config section
- Enable ephemeral certificate generation if appropriate for the environment (dev/test)
- Verify config file and mounts so the certificate section actually reaches quic_settings
Example fix
// before [quic] verify_client_certs = false // after [quic.certificate] cert = "/etc/certs/server.crt" key = "/etc/certs/server.key"
Defensive patterns
Strategy: validation
Validate before calling
fn validate_quic_certs(s: &QuicSettings, allow_ephemeral: bool) -> Result<(), String> {
if s.certificate.is_none() && !allow_ephemeral {
return Err("QUIC enabled but no certificate configured and ephemeral certs disabled".into());
}
Ok(())
} Type guard
fn has_quic_certs(s: &QuicSettings) -> bool { s.certificate.is_some() } Try / catch
match launch_quinn_server(&settings, false).await {
Err(e) if e.to_string().contains("Missing QUIC certificate") => eprintln!("provide quic.certificate config or enable ephemeral certs"),
r => r?,
} Prevention
- Ship a config schema check that requires quic.certificate in production profiles
- Document the ephemeral-cert flag as dev-only
- Mount cert files in container images before enabling QUIC
When it happens
Trigger: QUIC settings present without a certificate section, and launch_quinn_server invoked with generate_ephemeral_cert = false (e.g. production mode).
Common situations: Deploying with a stripped-down config that omits the quic certificate block; running in production where ephemeral certs are intentionally disabled; forgetting to mount cert files in containers.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
- SSL/TLS and certificate errors — how TLS handshakes and certificate validation fail.
Related errors
- Failed client config
- Maintenance TLS is partially configured: cert_file and…
- No alpns provided
- No handshake data
- No protocol found on request
AI-assisted analysis of EpicGames/lore@074eb0b0d1 (2026-09-13).
Data as JSON: /api/errors/0d8791aba8ead656.
Report an issue: GitHub.
Appendix: source
Thrown at lore-server/src/server.rs:372
process_limit.saturating_mul(streams as usize)
})
}
async fn launch_quinn_server(
name: &'static str,
stream_handler_factory: Box<dyn StreamHandlerFactory>,
metrics_frequency: Duration,
quic_settings: QuicSettings,
generate_ephemeral_cert: bool,
mut shutdown_rx: tokio::sync::watch::Receiver<bool>,
) -> Result<()> {
let span = info_span!("QUIC server", name);
async {
let cert_settings = match quic_settings.certificate.clone() {
Some(cert_settings) => cert_settings,
None if generate_ephemeral_cert => generate_ephemeral_certificate(name)?,
None => return Err(anyhow!("Missing QUIC certificate config")),
};
let client_verifier = if quic_settings.verify_client_certs {
let ca_path = cert_settings
.cert_chain
.clone()
.ok_or(anyhow!("Missing cert chain"))?;
build_cert_verifier(ca_path)?
} else {
Arc::new(NoClientAuth {})
};
let addr = SocketAddr::from_str(
format!("{}:{}", quic_settings.host, quic_settings.port).as_str(),
)?;
let mut settings_builder: QuinnConfigBuilder = quic_settings.into();
View on GitHub (pinned to 074eb0b0d1)