TLS1.3では0-RTTハンドシェイクという、1度通信を行い鍵が共有できている相手とはハンドシェイク中にアプリケーションデータ(Early Data)を送信する手順があります。
"先日のコミット"によって、Chromeでも使用できるようになったので試す。なお再送攻撃に対して脆弱なため、GETリクエストのときのみ使用されます。
Chrome
まだChrome Canaryまでしかこの機能が降ってきてないので、Canary で試す。
chrome://flags
より、「TLS 1.3 Early Data」を有効にする
サーバ側
「NginxでTLS1.3の0-RTTハンドシェイク (ssl_early_data)を試す」の通り。0-RTT対応サーバを用意する。
現在はOpenSSLでビルドしても、ssl_early_data on;
にすれば動作する。
今回はHTTP/2は無効にしておく
動作確認
今回は簡単にWiresharkで、通信を復号しその様子を確認する。
基本的には、一度通信を行ったあとサイトを離れコネクションがクローズされたことを確認する。その後、再度サイトにアクセスする。
2度目のハンドシェイク中にEarly Dataを送信している様子
Early DataとしてHTTPリクエストを送信し、その応答としてHTTPレスポンスを受け取ってる様子がわかる。
(クライアント側でパケットキャプチャしているが、ServerHelloを受信してからEarly Dataを送信しているるように見えるが。。。要確認)