TLSのバージョンは以下の表記になる。
SSLv3 = 0x0300
TLSv1.0 = 0x0301
TLSv1.1 = 0x0302
TLSv1.2 = 0x0303
TLSv1.3 = 0x0304
しかし、キャプチャを眺めているとTLSv1.3でもTLSv1.2の「0x0303」で流れている。
何故TLSv1.2と同じなのかと思い調べてみた。
目次
原因
clienthelloはTLS1.2(0x0303)で投げて、サーバがTLS1.3に対応していればServerHelloをTLS1.2(0x0303)で拡張にTLS1.3(0x0304)で応答する仕様。
それ故、一見するとTLSv1.3の通信はTLS1.2にも見える。
クライアント側ではTLS拡張の、Supported_versionにTLS1.3(0x0304)、TLS1.2(0x0303)、TLS1.1(0x0302)、TLS1.0(0x0301)などサポートしているプロトコルを格納してclient helloを投げる。
で、サーバ側でTLS1.3をサポートしていれば、Extension: supported_versions(拡張43)にTLS1.3(0x0304)を格納して、server helloを投げ返してtls1.3で通信へ。
ただし、handshakeのプロトコルバージョンはTLS1.3にならない。TLS1.2(0x0303)で表示される。
更に調べていると、server helloの拡張43のtls1.3のバージョン表記がunknownになるという情報もあったけど、0x0304で格納されるようになったみたい。
2018年の夏にTLS1.3のRFCがでたあたりで更新されたのかな?
RFC 8446 – The Transport Layer Security (TLS) Protocol Version 1.3
参考にしたサイト
【図解】tls1.3の仕組みとシーケンス ~tls1.2との違い,QUICに向けた0-RTT, key_shareやHelloRetryRequest, NewSessionTicketとPSKの関係, コネクションとセッションの違い~│SEの道標
錆びついたTLSを滑らかに、GoogleによるGREASE試験 – ぼちぼち日記
分かりにくい仕様なので、パケットをキャプチャして実際に確認して記事化してみようと思う。