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