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 nilView on GitHub (pinned to b6b368adc5)
Solutions
- Ensure the QUIC stack passes its transport parameters into the TLS layer so they are sent as the extension
- 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
- Plumb QUIC transport parameters into the TLS engine before starting the handshake
- Use a maintained QUIC library (quic-go, quiche, lsquic) that emits the extension
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
- SSL/TLS and certificate errors — how TLS handshakes and certificate validation fail.
Related errors
- tls: client offered TLS version older than TLS 1.3
- tls: client sent an unexpected quic_transport_parameters ext
- tls: missing signature_algorithms from TLS 1.2 peer
- tls: peer doesn't support any of the certificate's signature
- tls: server sent unrequested session ticket
AI-assisted analysis of golang/go@b6b368adc5 (2026-08-12).
Data as JSON: /api/errors/db6173fbecb4f650.
Report an issue: GitHub.