{"record":{"id":"db6173fbecb4f650","repo":"golang/go","slug":"tls-client-did-not-send-a-quic-transport-paramete","errorCode":null,"errorMessage":"tls: client did not send a quic_transport_parameters extension","messagePattern":"tls: client did not send a quic_transport_parameters extension","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/crypto/tls/handshake_server_tls13.go","lineNumber":278,"sourceCode":"\tselectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, c.quic != nil)\n\tif err != nil {\n\t\tc.sendAlert(alertNoApplicationProtocol)\n\t\treturn err\n\t}\n\tc.clientProtocol = selectedProto\n\n\tif c.quic != nil {\n\t\t// RFC 9001 Section 4.2: Clients MUST NOT offer TLS versions older than 1.3.\n\t\tfor _, v := range hs.clientHello.supportedVersions {\n\t\t\tif v < VersionTLS13 {\n\t\t\t\tc.sendAlert(alertProtocolVersion)\n\t\t\t\treturn errors.New(\"tls: client offered TLS version older than TLS 1.3\")\n\t\t\t}\n\t\t}\n\t\t// RFC 9001 Section 8.2.\n\t\tif hs.clientHello.quicTransportParameters == nil {\n\t\t\tc.sendAlert(alertMissingExtension)\n\t\t\treturn errors.New(\"tls: client did not send a quic_transport_parameters extension\")\n\t\t}\n\t\tc.quicSetTransportParameters(hs.clientHello.quicTransportParameters)\n\t} else {\n\t\tif hs.clientHello.quicTransportParameters != nil {\n\t\t\tc.sendAlert(alertUnsupportedExtension)\n\t\t\treturn errors.New(\"tls: client sent an unexpected quic_transport_parameters extension\")\n\t\t}\n\t}\n\n\tc.serverName = hs.clientHello.serverName\n\treturn nil\n}\n\nfunc (hs *serverHandshakeStateTLS13) checkForResumption() error {\n\tc := hs.c\n\n\tif c.config.SessionTicketsDisabled {\n\t\treturn nil","sourceCodeStart":260,"sourceCodeEnd":296,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/crypto/tls/handshake_server_tls13.go#L260-L296","documentation":"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.","triggerScenarios":"QUIC client omits the quic_transport_parameters extension from the ClientHello entirely (hs.clientHello.quicTransportParameters == nil).","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// QUIC client: ensure transport parameters are passed to the TLS layer.\nif len(quicTransportParams) == 0 {\n    return errors.New(\"QUIC requires transport parameters; cannot start handshake without them\")\n}","typeGuard":null,"tryCatchPattern":"if err := tlsConn.Handshake(); err != nil {\n    if strings.Contains(err.Error(), \"quic_transport_parameters\") {\n        log.Printf(\"QUIC client missing transport params from %v\", remote)\n    }\n    c.Close()\n    return\n}","preventionTips":["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"],"tags":["tls","go","quic","transport-parameters","rfc9001","handshake"],"backgroundTag":null,"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}