こんにちはインフラの後藤です。

今回はTLS1.3を実環境で試してみました。

TLS1.3はTLSのメジャーバージョンアップとも言われるように、様々な改善が含まれています。

例えば、以前「TLS1.3のハンドシェイクがもう来てる」で書いたように、TLS1.3ではハンドシェイク時のパケットの往復回数が減っており、より早くコネクションを確立できます。

すでに、ブラウザや暗号ライブラリはTLS1.3に対応してきておりますので、実環境で具体的にどれくらいコネクションの確立が早くなるのか確認してみました。

TLS1.3 バージョンネゴシエーションとネゴシエーション

測定の前に今回利用したTLS1.3 draftバージョンについて補足します。

TLS1.3は draft-28 版が最新のバージョンです。こちらが文章上の修正を経て将来的にRFCとなります。

TLS1.3はファイアウォール等の中間装置の不具合を避けるためにハンドシェイク中にsupported_versions拡張を利用してネゴシエーションしますが、現状はdraft版実装を示すバージョンでネゴシエーションをしています。

下記はsupported_versions拡張の例で、ClientからTLS1.3 draft-23版でネゴシエーションしています。(Unknown (0x9a9a)はGREASE です)。

ゲーム起動 Extension: supported_versions (len=11) Type: supported_versions (43) Length: 11 Supported Versions length: 10 Supported Version: Unknown (0x9a9a) Supported Version: TLS 1.3 (draft 23) (0x7f17) Supported Version: TLS 1.2 (0x0303) Supported Version: TLS 1.1 (0x0302) Supported Version: TLS 1.0 (0x0301) 1 2 3 4 5 6 7 8 9 Extension : supported_versions ( len = 11 ) Type : supported_versions ( 43 ) Length : 11 Supported Versions length : 10 Supported Version : Unknown ( 0x9a9a ) Supported Version : TLS 1.3 ( draft 23 ) ( 0x7f17 ) Supported Version : TLS 1.2 ( 0x0303 ) Supported Version : TLS 1.1 ( 0x0302 ) Supported Version : TLS 1.0 ( 0x0301 )

実装により現状どのdraftバージョンを実装しているか異なっています。このsupported_versions拡張を見ることでクライアントの対応状況を確認できます。

直近、弊社のサービスに接続しにくるTLS1.3対応クライアントの実装はdraft-23が支配的でした。

そこで、今回は TLS1.3 draft-23を使用します。draft-23は最新版ではありませんが、主なハンドシェイクの流れは最新版と同じです。

ハンドシェイクの早さ比較

弊社スマートフォン向けサービスで、実験的にTLS1.3 draft-23 対応サーバに対してリクエストを送信するようにし、TLS1.2の場合とコネクションの確立の早さを比較しました。

具体的には、サーバ側でClientHelloを受け取ってから、アプリケーションデータ(Application Data)を受け取るまでにかかった時間を測りました。

TLS1.3とTLS1.2毎に、ラグの分布は以下の通りでした。

上記のグラフは、TLS1.3でClientHelloを受け取ってからApplication Data受取るまでの時間が20ms台なのは、TLS1.3ハンドシェイク中 15.7%ということを示しています。

多くの場合において、TLS1.3の方が早くTLSハンドシェイクを完了できています。

TLS1.3, TLS1.2とも2つ山が出来ているのは Wi-Fiを使っているクライントと携帯回線を利用しているクライントでRTTが異なるためかと思われます。

特に後者の山では、TLS1.3では50ms~60ms程度ですが、TLS1.2では110~120msとなっています。TLS1.3に比べTLS1.2の方が1RTT分早いと思うと、大体そのとおりになっていそうです。

(Resumptionに関して、本サーバでは数としては微量でグラフ上にはほぼ現れていません)

今後

今回は、TLS1.3とTLS1.2のハンドシェイクの早さを比較しました。

概ね想定通り、1RTT(30ms~60ms程度)分だけ TLS1.3 の方が早くハンドシェイクを完了できているようです。

TLS1.3の標準化は、RFC Editor queue フェーズに入っており、RFCとして出るのを待つばかりとなっています。

draft版が実装されている現状では、そのバージョンが同じでないとネゴシエーションが出来ませんが、RFCが出ればTLS1.3の正式版に統一されていきます。すでに各実装・暗号ライブラリはdraft-28版に対応してきていますので、正式版のサポートも比較的速やかに行われると思います。

これから、TLS1.3対応は進んで行き自然にTLS1.3が使用されるようになっていくでしょう。

もちろん、TLS1.3は様々な変更が含まれていますし、0-RTTハンドシェイクやSNIの異なるResumptionも使われていくかもしれません。

引き続きTLS1.3を使って色々試していければと思います。それでは、またどこかで

注意