crypto/tls: remove minimum version requirement for tls.Config used for QUIC
要約
概要
crypto/tls パッケージがQUIC接続に対して tls.Config.MinVersion >= VersionTLS13 を強制的に要求する制約を廃止し、QUIC使用時は内部的にTLS 1.3を下限として扱う変更を提案するものです。これにより、TCP(HTTP/2)とQUIC(HTTP/3)でひとつの tls.Config を共有できるようになります。
ステータス変更
likely_accept → accepted
2026年3月11日のProposal Review Meetingで「likely accept」と判定され、その後1週間異論がなかったため、2026年3月18日に正式に承認されました。レビュー中に「QUICは引き続きTLS 1.3以上を使用する。渡された tls.Config そのものを変更するわけではない」という重要な確認がなされ、懸念が解消されました。
技術的背景
現状の問題点
RFC 9001によりQUICはTLS 1.3を必須としているため、crypto/tls はQUIC接続時に tls.Config.MinVersion >= VersionTLS13 が設定されているかを明示的にチェックしています。これが問題となるのは、HTTP/2(TLS 1.2以上)とHTTP/3(TLS 1.3のみ)を同一サーバーで提供する「デュアルスタック構成」の場合です。
// 現状: TLS 1.2を許容するConfigはQUICでそのまま使えない
tlsConfig := &tls.Config{
MinVersion: tls.VersionTLS12, // HTTP/2のために必要
}
// QUICで使うためにCloneして上書きが必要
quicConfig := tlsConfig.Clone()
quicConfig.MinVersion = tls.VersionTLS13
Config.Clone() を使ったこのワークアラウンドは、Go 1.25.6 のセキュリティ修正(Issue #77113)により自動生成されたセッションチケットキーがコピーされなくなったため、セッション再開(session resumption)が正常に機能しなくなるという深刻な問題を引き起こしています。
提案された解決策
QUICコンテキストで tls.Config が使用される際、crypto/tls 内部で有効な最小バージョンをTLS 1.3に固定します。元の tls.Config のフィールドは変更せず、QUIC以外の用途(TCP/TLS)では従来通りの動作を維持します。
これによって何ができるようになるか
HTTP/2とHTTP/3を提供するデュアルスタックHTTPサーバーを、単一の tls.Config で構成できるようになります。QUICライブラリ(quic-goなど)が Config.Clone() を呼び出す必要がなくなるため、セッション再開の問題やクローン時のオーバーヘッドが解消されます。
コード例
// Before: MinVersion の違いにより Clone が必要
tlsConfig := &tls.Config{
MinVersion: tls.VersionTLS12, // HTTP/2のために設定
Certificates: []tls.Certificate{cert},
}
// QUICでは Clone してから MinVersion を上書き(セッション再開が壊れる)
quicTLSConfig := tlsConfig.Clone()
quicTLSConfig.MinVersion = tls.VersionTLS13
quicConf := &tls.QUICConfig{TLSConfig: quicTLSConfig}
// After: 同一の Config をそのまま共有可能
tlsConfig := &tls.Config{
MinVersion: tls.VersionTLS12, // HTTP/2のために設定(QUIC側は内部でTLS 1.3に固定)
Certificates: []tls.Certificate{cert},
}
quicConf := &tls.QUICConfig{TLSConfig: tlsConfig} // Clone不要
議論のハイライト
- 元の
tls.Configは変更されない: QUICがTLS 1.3に内部クランプしても、渡されたConfig自体は書き換えられない。これはレビューで明示的に確認された重要な設計原則。 - Clone のカスケード問題: Issue #77113(
Cloneがセッションチケットキーをコピーしない仕様変更)と Issue #77363(QUIC向けコールバックへの偽net.Conn注入のためのClone)が連鎖し、QUICライブラリがCloneを使わざるを得ない状況が深刻化していた。 - RFC 9001への準拠: QUIC上のTLSはTLS 1.3のみを使用することがRFCで規定されており、この変更は仕様に完全準拠しつつユーザーの設定負担を軽減する。
- 既存の関連Issue: Issue #63722(2023年)で同様の提案がされており、今回の提案はその実現に向けた動きと考えられます。
- 実装CL:
go.dev/cl/745980およびgo.dev/cl/537575で実装が進められています。
関連リンク
- Proposal Issue github.com/golang/go
- Review Comment proposal review meeting
- 関連Issue: allow QUIC to configure net.Conn used on ClientHelloInfo #77363
- Proposal Issue
- Review Minutes
- 関連Issue: crypto/tls: don't require Config to set MinVersion = TLS13 when using QUIC #63722
- 関連Issue: Config.Clone copies automatically generated session ticket keys #77113