TLS 1.3 ドラフト24で重要な変更は1つだけ。レコードのバージョン。
ドラフト23では
に定められた。これはこれでよい。
しかし、サーバから HelloRetryRequest なる ServerHello が返され場合はどうなるだろう? ある実装では
- ClientHello のレコードバージョンは 0x0301 (TLS 1.0)
- ServerHello (HRR) のレコードバージョンは 0x0303 (TLS 1.2)
- ClientHello のレコードバージョンは 0x0301 (TLS 1.0)
- ServerHello のレコードバージョンは 0x0303 (TLS 1.2)
となるだろう。また別の実装では、
- ClientHello のレコードバージョンは 0x0301 (TLS 1.0)
- ServerHello (HRR) のレコードバージョンは 0x0303 (TLS 1.2)
- ClientHello のレコードバージョンは 0x0303 (TLS 1.2)
- ServerHello のレコードバージョンは 0x0303 (TLS 1.2)
となるだろう。
どちらがミドルボックスを騙せるかというと、後者である。前者はレコードのバージョンがころころ変わるから、ミドルボックスが怪しいと思って通信を遮断するかもしれない。
というわけで、2回目の ClientHello のレコードバージョンは、0x0303 に定められた。なお、実装者間の合意ではドラフト 24 に対応しても、supported_versions 拡張に指定するTLSのバージョンにはドラフト 23 の値を使うことで合意が取れている。
個人的には、レコードの書式にバージョンフィールドがあるのはプロトコルの設計ミスだと思う。