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

  1. Add the certificate (and key) settings under the QUIC config section
  2. Enable ephemeral certificate generation if appropriate for the environment (dev/test)
  3. 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

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.

Related errors


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)