SSL/TLS の暗号化通信シーケンス

インターネットで最も使われている暗号化通信は SSL/TLS であろう。SSL Secure Socket Layer の略で、TLSTransport Layer Security の略、前者はバージョン3まで Netscape によって作られ、後者は IETF で仕様が策定されているものである。 SSLv3 ≒ TLS 1.0 であり、SSLv3 は TLS 1.0 相当だと思えばよい。だからよく SSL/TLS と表記されることが多いのだ。今では SSLv3 も使われているために混在するが、今後は TLS 1.0 以降が使われていくことになるだろう。なお、TLS 1.0 は RFC2246 である。 その SSL/TLS であるが、このプロトコルは実は私は RFC を読んでも意味がまったくわからなかった。しかし心配する必要はない。理解できないのはあなたの頭が悪いからでなく、たぶん RFC に書かれている書き方が悪いからだろう。シーケンス図にしてもテキスト文書オンリーで書かれているので表現力に限界があると思う。 私は実際にネットに流れるパケットを覗いてみてそのシーケンスを理解できた。そこで暗号化通信を始めるために必要最小限のシーケンスを書いてみた。 SSL/TLS シーケンス図 基本的に、4つのメッセージデータ(といってもバイナリ文字列)をやり取りするだけで暗号化通信を始められる。この後は、データが暗号化されて通信が行われる。
  1. Client Hello まず最初にクライアントがサーバに対して Client Hello メッセージを送る。このメッセージの中には乱数、セッションID、この通信でデータを暗号化するために使えるアルゴリズムの種類のリスト(候補)(Cipher Suites)、圧縮方式(Compression Methods)が含まれる。いろんなデータがあるが、これらをまとめてサーバに送る。
  2. Server Hello 乱数、セッションID、この通信でデータを暗号化するために使えるアルゴリズム、圧縮方式、サーバの証明書、Server Hello Done といったメッセージをクライアントに返す。このとき、サーバの証明書を受け取ったクライアントはサーバの証明書と CA の証明書から署名を照合して、この証明書からの署名が正しいかどうかをチェックする。 SSL/TLS 通信しようとしてブラウザとかから警告メッセージが出たのをみたことがある人は、この段階のサーバ証明書のチェックでブラウザが警告を発してることになる。
  3. Client Key Exchange クライアントが生成した(48バイトの)乱数(プリマスターシークレット)をサーバの公開鍵で暗号化してサーバへ送る。クライアントとサーバはこの値をもとに以降の通信で使う共通鍵暗号方式の秘密鍵(マスターシークレット)を生成する。
  4. Change Cipher Spec
  5. 暗号化したハンドシェイクのメッセージをクライアントに送る。この時点では暗号化する共通鍵(マスターシークレット)がクライアントとサーバの間で取り決められていて、以降のクライアントとサーバのデータのやり取りでは先に取り決めた暗号化アルゴリズムによって、データを暗号化して通信する。
Update: 2006/10/03 Original: 2006/09/23
トラックバック URL: https://perltips.twinkle.cc/trackback/131
Posted on 2006-10-02 by yas |