前回はインターネットの代名詞と言えるプロトコルのHTTPを解説しました(前回の解説はこちら)。その中で、HTTPの暗号化に多用されているSSL(およびその発展型であるTLS)についてはHTTPと「事実上不可分」と書きました。今回はそのSSL/TLSについての解説です。
HTTPの解説でも述べたように、SSL 3.0とTLS 1.0の基本動作はほぼ同じです。今回の解説ではSSL 3.0を基本として、TLSについては必要に応じて注釈を入れることにします。使用する用語もSSL/TLS共通の内容については「SSL」を基本とし、TLSに特有の記述のみ「TLS」と記します。
SSLの基本動作
SSLの動作は「初期情報交換(Hello)」「暗号鍵の交換(Key Exchange)」「暗号通信の開始(Change Cipher Spec)」の3段階から成ります。簡単に書くと以下のようになります。
以降の通信は暗号化されます。これだけなら単純な動作に見えます。
SSLの通信データ構造は「レコード」という外枠にまとめられ、必要に応じてレコードの中に「メッセージ」が含まれます。C言語風に書くと以下のような構造となります。
struct Message {
unsigned char msg_type;
unsigned char length[3];
unsigned char body[*];
};
struct Record {
unsigned char type;
unsigned char version[2];
unsigned char length[2];
union {
struct Message message[*];
unsinged char plain_data[*];
} record_data;
};