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

39266 ワード

はじめに

前回自作でTCPIP+HTTPを実装して動作を確認することができました。
しかしご覧頂いた方はおわかりのように、通信はHTTP=平文でやり取りされておりパスワードなど機密情報が用意に見れてしまう状態です。

普段我々がブラウザに安心してパスワードを入力しているのは通信がTLSで暗号化されているからです。ではそのTLSの仕組みはどうなっているのでしょう?
恥ずかしい限りですが僕はわかりません。😇😇😇

ということで以下を読みながらTLSプロトコルを自作してみてその仕組みを学ぶことにします。

今回の実装方針です。

  • TLS1.2プロトコルを自作する
  • 暗号化などの処理はcryptパッケージの関数を適時利用する
  • tcp接続にはconnectを使う
  • 鍵交換はまずRSAで作成する
  • TLS_RSA_WITH_AES_128_GCM_SHA256をサポートする

さすがに暗号化などの処理自体も独自で作るのは無理があろうと思われますので、そのあたりはcryptoパッケージを使います。
また前回TCPのハンドシェイクする処理を作りましたが、そこは使わず今回はconnectを使ってSkipします。debugが面倒なのとTLSの実装に注力するためです。
connectでTCP接続したあとは、writeとrecvしか使いませんので、まぁ自作と言えるでしょう。

前回と同じくgolang初心者なので変なコードが多分にあるでしょうが、生暖かい目でよろしくお願いします。🙇‍♂️🙇‍♂️🙇‍♂️
TLS自体の解説はあまりせず作ったコードの解説が主なのでそのへんもご了承ください。コードは以下にあります。