SSL/TLS とは
SSL ( Secure Socket Layer ) 及び TLS ( Transport Layer Security ) とはインターネット上で発生する「盗聴」「改ざん」「なりすまし」を暗号化技術により回避する技術のこと。 本記事では、SSL/TLS 上で活用されているプロトコルの概要を追うことにより、SSL/TLS でどのように安全性が担保されているのかを理解することを目的とする。
SSL/TLS で利用されるプロトコルの概要
- Record Protocol: 上位レイヤからのデータを暗号化し、通信相手に送信する。また、受信したデータを複合、伸長して上位レイヤに引き渡す役割をもつ。
- Handshake Protocol: 暗号化通信をするために必要な、暗号化アルゴリズム、キー、証明書などを通信相手と決定するためのネゴシエーションを行うプロトコル。
- Change Cipher Spec Protocol: Handshake で決めた新しい暗号化通信パラメータの利用開始を通信相手に通知し、自らも利用を開始するプロトコル。
- Application Data Protocol: 現在利用している暗号化通信パラメータに従い、アプリケーションデータを透過的に送受信するプロトコル。
- Alert Protocol: 通信中に発生したイベントやエラーを通信相手に通知するプロトコル。
では各プロトコルの具体的な内容を見てみよう。
Record Protocol
Record Protocol は Handshake Protocol などの他のプロトコルよりも下位のレイヤーに存在するプロトコルであり、 それら上位プロトコルは Record Protocol を介して通信相手とやりとりを行うことになる。Record Protocol の役割は暗号化であり、上位のプロトコルでの通信内容は原則として暗号化されていることになる。
TLS レコードの先頭には短いヘッダがあり、その中には
- ContentType: レコードのコンテントタイプ
- ProtocolVersion: プロトコルのバージョン
- length: レコードの長さ
が含まれる。
そのヘッダの後にメッセージデータが続く。
また、形式的に、TLS レコードのフィールドは以下のように定義されている。
struct {
unit8 major;
unit8 minor;
} ProtocolVersion;
enum {
change_cipher_spec (20),
alert (21),
handshake (22),
application_data (23)
} ContentType;
struct {
ContentType type;
ProtocolVersion version;
unit16 length; /* 最長 2^14 (16384) バイト */
opaque fragment[TLSPlaintext.length];
} TLSPlaintext;
以下に、Record Protocol の役割を示す。
- メッセージの転送: Record Protocol は別レイヤから渡される書式の決まっていないデータのバッファを転送する。レコード長には制限があり ( 16384 バイト )、それより長いバッファは Record Protocol により小さなチャンクへと分割される。
- 暗号化及び完全性の検証: TLS では最初にネゴシエージョンを行なって暗号化パラメータを決定する性質上、最初の接続におけるメッセージ群は保護されない。一旦ネゴシエーションが完了すると、決定された暗号化パラメータにより暗号化及び完全性の検証が始まる。
- 圧縮: 外向きのトラフィックはすでに HTTP レベルで圧縮されていることがあるため、Record Protocol での圧縮は現在利用されていない。
- 拡張性: Record Protocol が担うのはデータ転送と暗号処理であり、他の機能はすべてサブプロトコルで行う。それらサブプロトコルは前述の Handshake Protocol、Change Cipher Spec Protocol、Application Data Protocol、Alert Protocol である。