golangで作るTLS1.3プロトコル

43231 ワード

はじめに

前回までの記事でTLS1.2プロトコルスタックを自作してみました。

ただ皆さんご存知の通り、TLS1.2の脆弱性の対策やQUICなど新しいプロトコルへの対応を考慮して設計したTLS1.3が2018年にリリースされ普及が進んでいます。
使用率ではまだTLS1.2が一般的ですが今後は1.3へと置き換えが進んでいくと、どこかの時点で逆転するのでしょう。そのときに慌てて学ぶよりも、今1.3も実装して学ぶことにします😊

まぁ1.2作れたしイケるでしょう(死亡フラグ😇😇😇)

今回の実装方針です。

  • crypto/tls は一切使わずTLS1.3のフルハンドシェイクをオレオレで実装する
  • 使える部分は前回までのTLS1.2の実装を再利用する
  • cipher suitesは TLS_CHACHA20_POLY1305_SHA256 を使う
  • TLS1.3でハンドシェイクしてからnginxにHTTPリクエストを送りhtmlが返ってきたらOK

今回も基本RFCと参考文献、Wiresharkeでパケットを見ながら実装していきます。

実装を中心に説明していくので、一般的なTLS1.3の解説にはなっておりません。その辺は適時参考文献などで補ってください。
また都度ググって調べながら、実装してるので変なコードや説明、認識違いなどあると思いますが、ご指摘頂ければと。

コード自体は以下にあります。