1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プロフェッショナルTLS&PKI を読む24 第3章 TLS1.2,1.3のClientHelloメッセージ

1
Last updated at Posted at 2026-10-19

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         
1
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?