メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#77631accepted

crypto/tls: remove minimum version requirement for tls.Config used for QUIC

ステータス変更: likely_accept accepted

要約

AIによる要約であり、誤りを含む場合があります。

概要

crypto/tls パッケージがQUIC接続に対して tls.Config.MinVersion >= VersionTLS13 を強制的に要求する制約を廃止し、QUIC使用時は内部的にTLS 1.3を下限として扱う変更を提案するものです。これにより、TCP(HTTP/2)とQUIC(HTTP/3)でひとつの tls.Config を共有できるようになります。

ステータス変更

likely_acceptaccepted
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 で実装が進められています。

関連リンク