俺、サービス売って家買うんだ

Swift, Kotlin, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

TLS/SSL - 暗号化編

f:id:ie-kau:20160927202714p:plain


数年間に渡りWebの仕事をしてきたのにまともに理解しようとしていなかったTLS/SSLについてまとめてみる。

TLS/SSLとは

コンピュータネットワーク上でセキュリティを要求される通信を行うためのプロトコル。

  • TLS = Transport Layer Security
  • SSL = Secure Sockets Layer

の略。

そもそもなんで2つあるの

普段はSSLって呼んでいるけど、TLS/SSLになっているのかというと、現在広く利用されている技術はTLSだけどその元になったSSLという略称が世の中に広がってしまったから。

TLS/SSLでできること

  1. 通信内容の暗号化
  2. 通信相手の認証

1. データの暗号化

インターネットのブラウジングでSSLを利用する場合は、トランスポート層のTCP/UDPとアプリケーション層の間で動作する。

※イメージ
f:id:ie-kau:20160926023117p:plain

Chromiumのsslクライアントっぽいところ(深追いはしてない)
[chrome] Index of /trunk/src/net/ssl

暗号化の概略

f:id:ie-kau:20160927195131p:plain

※説明のためにphaseを区切っているだけで、仕様上phaseが存在するわけではない。

暗号化のシーケンス

前提としてクライアント-サーバー間でTCPのThree-Way Handshakeは終わっておく必要がある。TCPのハンドシェイクが終わった段階でTLSのハンドシェイクが始まる。

概略しか書いていないので、詳細を知りたい場合は参考にしたQiitaの記事を読むと良い。
※ハンドシェイクに関しての詳細は下記記事が非常に勉強になりました。 qiita.com

Phase.1

TLSハンドシェイクの最初の通信で下記の要素を交換する。

  • 初期乱数
  • プロトコルのバージョン
  • SessionID
  • CipherSuite(暗号方式)
  • CompressionMethod(圧縮方式)
  • Extensions(拡張)

クライアントからの通知

  • ClientHello
    • 暗号方式、TLSのバージョンなどを伝える

サーバーからの通知

  • ServerHello
    • 暗号方式、TLSのバージョンなどを決定する

Phase.2

サーバーから証明書と公開鍵の送信。

サーバーからの通知

  • Certificate
    • 共有鍵を暗号化するための公開鍵を含んだサーバー証明書を送る
  • ServerHelloDone
    • サーバー側からのメッセージ通信の終了を知らせる

Phase.3

クライアントから共通鍵のもととなるプリマスターシークレットの送信。

サーバーからの通知

  • ClientKeyExchange
    • プリマスターシークレットの送信

Phase.4

サーバー -クライアント間でのハンドシェイク終了のやり取り。

クライアントからの通知

  • ChangeCipherSpec
    • 無暗号通信の終了を示す
  • Finished
    • ハンドシェイクの終了

サーバーからの通知

  • ChangeCipherSpec
    • 無暗号通信の終了を示す
  • Finished
    • ハンドシェイクの終了

パケットキャプチャ

f:id:ie-kau:20160929022436p:plain

wiresharkでパケットキャプチャリングした結果です。

  • TCPのハンドシェイクが終わった段階でClinet Helloが送られている
  • サーバーからのChange Cipher Specが終了してから TLSでApplication Dataの転送が始まっている

不明点

  • Continuation Dataとは?
  • Finshedの送受信がない(キャプチャできない?)

わからないところ多いですね。。どうやって調べたらいいんや・・

参考

まとめ

複雑!
認証編へ続く!

www.ie-kau.net

参考書籍

暗号技術入門 第3版 秘密の国のアリス

暗号技術入門 第3版 秘密の国のアリス

関連記事

www.ie-kau.net