golang/go · error

tls: client did not send a quic_transport_parameters extensi

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.

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)

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.