golang/go · error

tls: client did not send a quic_transport_parameters…

Error message

tls: client did not send a quic_transport_parameters extension

What it means

RFC 9001 §8.2 requires QUIC clients send the quic_transport_parameters TLS extension. Its absence in a QUIC handshake is non-compliant; the server sends missing_extension.

Solutions

  1. Ensure the QUIC stack passes its transport parameters into the TLS layer so they are sent as the extension
  2. Update the QUIC library to a version that correctly emits quic_transport_parameters
Defensive patterns

Strategy: validation

Validate before calling

// QUIC client: ensure transport parameters are passed to the TLS layer.
if len(quicTransportParams) == 0 {
    return errors.New("QUIC requires transport parameters; cannot start handshake without them")
}

Try / catch

if err := tlsConn.Handshake(); err != nil {
    if strings.Contains(err.Error(), "quic_transport_parameters") {
        log.Printf("QUIC client missing transport params from %v", remote)
    }
    c.Close()
    return
}

Prevention

When it happens

Trigger: QUIC client omits the quic_transport_parameters extension from the ClientHello entirely (hs.clientHello.quicTransportParameters == nil).

Common situations: QUIC stack bug where transport parameters are not plumbed into the TLS layer; partial QUIC implementation; mismatch between the QUIC transport and the TLS engine.

Understand the failure class

Related errors


AI-assisted analysis of golang/go@b6b368adc5 (2026-08-12). Data as JSON: /api/errors/db6173fbecb4f650. Report an issue: GitHub.

Appendix: source

Thrown at src/crypto/tls/handshake_server_tls13.go:278

	selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, c.quic != nil)
	if err != nil {
		c.sendAlert(alertNoApplicationProtocol)
		return err
	}
	c.clientProtocol = selectedProto

	if c.quic != nil {
		// RFC 9001 Section 4.2: Clients MUST NOT offer TLS versions older than 1.3.
		for _, v := range hs.clientHello.supportedVersions {
			if v < VersionTLS13 {
				c.sendAlert(alertProtocolVersion)
				return errors.New("tls: client offered TLS version older than TLS 1.3")
			}
		}
		// RFC 9001 Section 8.2.
		if hs.clientHello.quicTransportParameters == nil {
			c.sendAlert(alertMissingExtension)
			return errors.New("tls: client did not send a quic_transport_parameters extension")
		}
		c.quicSetTransportParameters(hs.clientHello.quicTransportParameters)
	} else {
		if hs.clientHello.quicTransportParameters != nil {
			c.sendAlert(alertUnsupportedExtension)
			return errors.New("tls: client sent an unexpected quic_transport_parameters extension")
		}
	}

	c.serverName = hs.clientHello.serverName
	return nil
}

func (hs *serverHandshakeStateTLS13) checkForResumption() error {
	c := hs.c

	if c.config.SessionTicketsDisabled {
		return nil

View on GitHub (pinned to b6b368adc5)