TLS/SSL - 暗号化編
数年間に渡りWebの仕事をしてきたのにまともに理解しようとしていなかったTLS/SSLについてまとめてみる。
TLS/SSLとは
コンピュータネットワーク上でセキュリティを要求される通信を行うためのプロトコル。
- TLS = Transport Layer Security
- SSL = Secure Sockets Layer
の略。
そもそもなんで2つあるの
普段はSSLって呼んでいるけど、TLS/SSLになっているのかというと、現在広く利用されている技術はTLSだけどその元になったSSLという略称が世の中に広がってしまったから。
TLS/SSLでできること
- 通信内容の暗号化
- 通信相手の認証
1. データの暗号化
インターネットのブラウジングでSSLを利用する場合は、トランスポート層のTCP/UDPとアプリケーション層の間で動作する。
※イメージ
Chromiumのsslクライアントっぽいところ(深追いはしてない)
[chrome] Index of /trunk/src/net/ssl
暗号化の概略
※説明のために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
- ハンドシェイクの終了
パケットキャプチャ
wiresharkでパケットキャプチャリングした結果です。
- TCPのハンドシェイクが終わった段階でClinet Helloが送られている
- サーバーからのChange Cipher Specが終了してから TLSでApplication Dataの転送が始まっている
不明点
- Continuation Dataとは?
- Finshedの送受信がない(キャプチャできない?)
わからないところ多いですね。。どうやって調べたらいいんや・・
参考
- 図解で学ぶネットワークの基礎:SSL編 - 図解で学ぶネットワークの基礎:SSL編:ITpro
- Networking 101: Transport Layer Security (TLS) - High Performance Browser Networking (O'Reilly)
- Transport Layer Security - Wikipedia
まとめ
複雑!
認証編へ続く!
参考書籍
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/08/26
- メディア: 大型本
- この商品を含むブログ (14件) を見る