RFC8879 TLS Certificate Compression について

RFC8879 TLS Certificate Compression」が昨日公開されました。

これは、TLSハンドシェイク中に送信されるサーバ証明書を圧縮する仕組みを定義しています。

これによって、ハンドシェイクの通信量を削減できます。ハンドシェイク中は、パケットロスが起こっても後続のパケットは多くないのでロスリカバリとしては不利な状況です。ハンドシェイクに必要なパケット数が減るというのはメリットが有るのかなと思います。

また、QUIC(HTTP/3)においてもTLSハンドシェイクを利用していますが、QUICではClient Address Validationが終わるまで一度に送れる通信量に制限があるため、通信量が減ることはそういった意味でもメリットがあります。

この点については、FastlyのPatrick McManus氏がブログを書かれています。実際に送信されるパケット数がどうなるかといった統計データもあり興味深いです。
www.fastly.com

なお、TLS1.2以下ではこの仕組みは使えないことになっています。

TLS Certificate Compression

TLS Certificate Compressionは以下のような流れで行われます

f:id:ASnoKaze:20201203235800p:plain

  • クライアントはClientHelloにおいて、compress_certificate拡張で圧縮アルゴリズムを指定します
  • サーバは暗号化されたCompressed Certificateメッセージで圧縮された証明書を送信します

仕様内で定義されている圧縮アルゴリズムは次の3つで

  • zlib
  • zstd
  • brotli

試してみる

Google Chrome及び、Facebookがすでにこの機能に対応しているので試してみます。なお、Compressed Certificateメッセージは圧縮されているので復号してやる必要があります。

f:id:ASnoKaze:20201204000404p:plain

Wiresharkで通信を見てみると、下記の通りサイズが削減されている事がわかります

  • 元のサイズ: 2798バイト
  • 圧縮サイズ: 1968バイト

Chromeでは、QUICでの証明書圧縮は行われてなかったんですがちょうど本日修正コミットが入りましたね。
https://chromium.googlesource.com/chromium/src/+/5c5f62bfa818d30eb9c09e2f513f039c7ed9ef15