TLS 1.2 のClientHelloメッセージ
TLS 1.2の新規セッションでクライアントが最初に送信するメッセージがClientHelloです。
メッセージの例は下記です。
Handshake protocol: ClientHello
version: TLS 1.2 /* クライアントのサポートするver. */
Random
Client time: Jun 19 2036 07:37 GMT
Random bytes: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /* 32バイトの値 */
Session ID: (空)
Cipher Suites /* クライアントが対応可能な暗号スイートのリスト */
Suite: TLS_ECHDHE_RSA_WITH_AES_128_GCM_SHA256
Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
Suite: TLS_RSA_WITH_AES_128_GCM_SHA256
Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA
Suite: TLS_RSA_WITH_AES_128_CBC_SHA
Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA
Suite: TLS_RSA_WITH_RC4_128_SHA
Compression methods /* クライアントが対応している圧縮方法 */
Method: null
Extentions /* 拡張機能の指定 */
Extension: server_name
Hostname: www.ibm.com
Extension: renegotiation_info
Extension: elliptic_curves
Named curve: secp256r1
Named curve: secp384r1
Extension: signature_algorithms
Algorithm: sha1/rsa
Algorithm: sha256/rsa
Algorithm: sha1/ecdsa
Algorithm: sha256/ecdsa
TLS 1.2の各フィールドの説明は以下です。
Version
クライアントがサポートする最良のバージョンを表す
Random
32バイトの値で、うち28バイトは無作為に生成された値、残り4バイトにクライアントの時刻で決まる情報をセットする。
クライアントの時刻ベースの値4バイトは特にTLSセッションに影響は与えません。このフィールドは1994年に発生したNetscape Navigatorの致命的な欠陥が見つかり、貧弱な乱数生成器に対する防御として導入された、のだそうです。クライアントの時刻はブラウザーを特定するフィンガープリントとして悪用できてしまうのでブラウザーによっては実際の時刻にランダムな変更を施し足り、単純に4バイトのランダムな値をセットしたりしています。
このRandomの辺りはクライアントとサーバーの双方によって決まり毎回のハンドシェイクごとに一意の値になります。このことがリプレイ攻撃の防止として機能します。また最初に交換するデータの完全性検証を通じてTLSの認証における重要な役割を担います。
Session ID
最初の接続ではセッション再開のリクエストで無い事を示すため空の値をセットします。移行の接続でSession IDフィールドには32バイトのランダムで一意な値が識別子としてセットされます。Session IDはサーバーがキャッシュしており現在のセッション状態を把握しています。
Cipher Suites
クライアントが対応可能な暗号スイートの一覧が格納されています。
Compression methods
クライアントが対応可能な圧縮方法を複数指定可能です。デフォルトはnull(圧縮しない)です。
Extension
上記以外の付加的なデータをセットする拡張を任意の数セットする事が出来ます。
TLS 1.3 のClientHelloメッセージ
ClientHelloメッセージはTLS 1.3でも旧バージョンとほぼ共通ですが、TLS 1.2以前のバージョンと比較して多くのフィールドが廃止されています。
TLS 1.3で実質使用されているフィールドは3つだけです。(ProtocolVersion ,Random, CipherSuite)
uint16 ProtocolVersion;
opaque Random[32];
unit8 CipherSuite[2]; /* 暗号スイートのセレクター */
struct {
ProtocolVersion legacy_version = 0x0303; /* TLS 1.2を表すダミー */
Random random;
opaque legacy_session_id<0..32>;
Cipher_suites<2..2^16-2>;
opaque legacy_compression_methods<1..2^8-1>;
Extention extenstions<8..2^16-1>;
}ClientHello;
値が legacy_xxxx のProtocolVersionフィールドはダミーで実質使われていません。このダミーフィールドはTLS 1.2以前との互換性維持のため残されており、この結果古いサーバーやファイアーウォールのようなネットワーク上のミドルボックスでの予期しない挙動を抑制することができます。
TLS 1.3でのフィールドの説明は以下です。
ProtocolVersion
このフィールドはTLS 1.3では実質使用されておらず、旧バージョンとの互換性維持のため存在しています。フィールド値はダミーを表す legacy_version = 0X0303 = TLS 1.2 と同じになっています。(TLS 1.2以前ではRecordプロトコルとClientHelloの2か所にProtocolVersionの指定があり、様々な問題の原因になっていました。)
TLS 1.3ではExtentionにセットする値を使用してプロトコルバージョンのネゴシエーションを行います。
Random
TLS 1.2と同一。32バイトの暗号学的にランダムなデータを格納します。クライアントとサーバーの両方が提示します。この32バイトの値はランダム=無作為なので、ハンドシェイクの1回1回ごとのデータ列は統計学的に一意である、と言えます。
Session ID(TLS 1.3では廃止)
TLS 1.2で存在したSession ID フィールドは廃止されました。Session ID フィールドを使用していたsession resumptionの仕組みがTLS 1.3 では全面的に刷新されたためです。
CipherSuite
TLS 1.2 と同様。クライアントがネゴシエーションを試みる際の暗号スイートを優先度順に指定します。暗号スイートは2バイトの識別子で表現されます。
Compression method(TLS 1.3では廃止)
圧縮により情報漏洩が発生する危険性はTLS 1.3以前から知られていました。圧縮が暗号解読に利用できるのは、暗号化されたデータをネットワーク上で確認しつつ、トラフィックの中身を攻撃者が変更できるためです。
攻撃者は暗号化する内容を少しずつ変化させることで、本来見えないはずのデータの一部に関するデータを入手できます。
TLS 1.3では旧バージョンでは圧縮方法を指定していたフィールド(legacy_compression_methods?)はゼロ=圧縮無し にセットされます。
TLS 1.2以前でClientHelloメッセージにあったフィールドの多くは暗号化する目的で拡張 Extension に移動されました。
以下はOpenSSL 1.1.1DのClientHello メッセージ例です。(TLS 1.3。旧バージョンに関する一部パラメーター等は省略)
Handshake protocol: ClientHello
Version: TLS 1.2 /* ダミーのTLSバージョン */
Random: xxxxxx...(32ビットのランダム値)....xxxx
Session ID: xxxx...(原書では34ビット(hex記載).....xxxx
Cipher Suites /*クライアントのサポートする暗号スイートのリスト */
Suite: TLS_AES_256_GCM_SHA384
Suite: TLS_CHACHA20_POLY1305_SHA256
Suite: TLS_AES_128_GCM_SHA256
Compression Methods /* クライアントのサポートする圧縮 */
Method: null
Extensions /* 拡張機能の指定 */
Extension: server_name
Name: example.com
Extension: supported_groups
Group: x25519
Group: secp256r1
Group: x448
Group: secp521r1
Group: secp384r1
Extention: signature_algorithms
Algorithm: ecdsa_secp256r1_sha256
Algorithm: ecdsa_secp384r1_sha384
Algorithm: ecdsa_secp521r1_sha512
Algorithm: ed25519
Algorithm: ed488
Algorithm: rsa_pss_pss_sha256
Algorithm: rsa_pss_pss_sha384
Algorithm: rsa_pss_pss_sha512
Algorithm: rsa_pss_rsae_sha256
Algorithm: rsa_pss_rsae_sha384
Algorithm: rsa_pss_rsae_sha512
Algorithm: rsa_pkcs1_sha256
Algorithm: rsa_pkcs1_sha384
Algorithm: rsa_pkcs1_sha512
Extention: supported_Versions
Version: TLS 1.3
Extention: psk_key_exchange_modes
Mode: psk_dhe_ke
Extention: key_share
Key: Share Entry
Group: x25519
Key Exchange: xxxxx...(32ビットのkey値)....xxxx