あどけない話

インターネットに関する技術的な話など

TLS 1.3 開発日記 その1 実装状況

これは、http2 Advent Calendar 2016の1日目の記事です。

現在、IETFTLS 1.3 の標準化が大詰めを迎えています。僕も TLS 1.3 の標準化に参加しており、仕様の分かりにくい部分を直したり、TLS 1.3 を Haskell で実装したりしています。この開発日記のシリーズでは、TLS 1.3の仕組みを説明していこうと思います。

そもそも、なぜ TLS 1.3 が必要なのかは、TLSの動向をお読み下さい。なお、次のTLSのバージョンを何にするかは、現在もめていて、1.3ではなくなる可能性もあることに注意して下さい。

現在の実装

現在利用できる TLS 1.3 の実装の一覧は、Implementationsにまとまっています。僕がクライアントとしてよく使っているのは、Firefox Nightly、Chrome Canary、および picotls です。

TLS 1.3 を気軽に試したいなら、Firefox Nightly や Chrome Canary をインストールし、Implementationsに書かれている設定をした後に、CouldFlare の TLS 1.3 テストサーバにアクセスしてみるといいでしょう。ページが表示されると、TLS 1.3 でアクセスできたことになります。

Implementationsには、Wiresharkも掲載されていますが、実際にはTLS 1.3に対応していません。tcpdump などでキャプチャしたパケットを表示できるようになるには、時間がかかるかもしれません。

Haskellの実装

僕は Haskell コミュニティで以下のような役割を持っています。

過去2年ぐらいの間、WarpをHTTP/2に対応させてきました。その成果は、Experience Report: Developing High Performance HTTP/2 Server in Haskellという論文にまとまっています。また、TLSに関しては、足りない機能を実装してきました。

僕の次の目標は、HaskellTLSライブラリにTLS 1.3の機能を組み込むことです。(それが終わったら、QUICを実装したいと小声で言っておきます。)

TLS 1.3の開発は、Haskellの暗号ライブラリである cryptonite を拡張することから始まりました。cryptoniteには、Haskellで書かれた楕円曲線暗号があります。これを使って、HTTP/2に必要な ECDHE を実装しマージしてもらっていました。

しかし、Haskellで書かれた楕円曲線暗号は遅いという問題があり、Cで書かれたP256やCで書かれたX25519をバックエンドとして使えるように、抽象化のレイヤを設け、その上に ECDHE を再実装しました。確か4回ぐらい再実装したと思います。現在、その成果はレビュー中です。

次に、TLSライブラリ自体を拡張しました。現時点は、TLS 1.3のサーバ側のみ実装できており、4つのハンドシェイクモードすべてに対応しています。Firefox Nightly、Google Chrome、および picotls と相互接続性を確認しています。また、この TLS ライブラリを使って、Web アプリケーションが実際に動くことも確認しています。

TLS 1.3の実装を通じて驚嘆するのは、仕様の美しさです。理解すればする程、よく考えらえていると感じます。この開発日記では、その美しさの片鱗でも説明できればよいなと思います。

では、また次の記事でお会いしましょう。