0
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?

More than 1 year has passed since last update.

TLS 1.3: Change Cipher Spec, Client Hello(再送信)

Posted at

Change Cipher Spec, Client Hello(再送信)

サーバから Hello Retry Requestと Change Cipher specが来た後、clientが再度 Client Helloを最送信するところのフローです。

# src dest type length info
142 **localhost** example.com TLSv1.3 409 Change Cipher Spec, Client Hello
145 example.com **localhost** TCP 66 443 → 58364 [ACK] Seq=100 Ack=861 Win=68096 Len=0 TSval=2936265895 TSecr=107391639

serverからackが来てますね。

ひとつずつ見ていきます。

Change Cipher Spec

server側のと同じく、6bytesしかない小さなメッセージです。Change Cipher Specは TLS 1.2 では暗号化開始の合図だったようですが、TLS1.3では違うのかな。これはClienthelloを送り直す前に、お互いリセットし合う意味合いで送るんだろうか。

TLSv1.3 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
    Content Type: Change Cipher Spec (20)
    Version: TLS 1.2 (0x0303)
    Length: 1
    Change Cipher Spec Message

Client Hello (再送信)

当初clientは鍵交換に x25519というカーブを要望しました が、serverが secp256r1を使えと hello retry requestを返してきました。そこで、clientがsecp256r1を使う形で client helloを送り直す部分です。

TLSv1.3 Record Layer: Handshake Protocol: Client Hello
    Content Type: Handshake (22)
    Version: TLS 1.2 (0x0303)
    Length: 332
    Handshake Protocol: Client Hello
        Handshake Type: Client Hello (1)
        Length: 328
        Version: TLS 1.2 (0x0303)
        Random: a990959f0793ba1ff5a09d1a5eec06e87706c88ea969457fa59d9ba9dc0f0e32
        Session ID Length: 32
        Session ID: b1c8e600556b5561ceda33e4c9c0b59221e45d11fb5cc03de4c165861b34f642
        Cipher Suites Length: 32
        Cipher Suites (16 suites)
        Compression Methods Length: 1
        Compression Methods (1 method)
        Extensions Length: 223
        Extension: Reserved (GREASE) (len=0)
            Type: Reserved (GREASE) (64250)
            Length: 0
            Data: <MISSING>
        Extension: server_name (len=16)
            Type: server_name (0)
            Length: 16
            Server Name Indication extension
                Server Name list length: 14
                Server Name Type: host_name (0)
                Server Name length: 11
                Server Name: example.com
        Extension: extended_master_secret (len=0)
            Type: extended_master_secret (23)
            Length: 0
        Extension: renegotiation_info (len=1)
            Type: renegotiation_info (65281)
            Length: 1
            Renegotiation Info extension
                Renegotiation info extension length: 0
        Extension: supported_groups (len=10)
            Type: supported_groups (10)
            Length: 10
            Supported Groups List Length: 8
            Supported Groups (4 groups)
                Supported Group: Reserved (GREASE) (0xcaca)
                Supported Group: x25519 (0x001d)
                Supported Group: secp256r1 (0x0017)
                Supported Group: secp384r1 (0x0018)
        Extension: ec_point_formats (len=2)
            Type: ec_point_formats (11)
            Length: 2
            EC point formats Length: 1
            Elliptic curves point formats (1)
                EC point format: uncompressed (0)
        Extension: session_ticket (len=0)
            Type: session_ticket (35)
            Length: 0
            Data (0 bytes)
        Extension: application_layer_protocol_negotiation (len=14)
            Type: application_layer_protocol_negotiation (16)
            Length: 14
            ALPN Extension Length: 12
            ALPN Protocol
                ALPN string length: 2
                ALPN Next Protocol: h2
                ALPN string length: 8
                ALPN Next Protocol: http/1.1
        Extension: status_request (len=5)
            Type: status_request (5)
            Length: 5
            Certificate Status Type: OCSP (1)
            Responder ID list Length: 0
            Request Extensions Length: 0
        Extension: signature_algorithms (len=18)
            Type: signature_algorithms (13)
            Length: 18
            Signature Hash Algorithms Length: 16
            Signature Hash Algorithms (8 algorithms)
                Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)
                    Signature Hash Algorithm Hash: SHA256 (4)
                    Signature Hash Algorithm Signature: ECDSA (3)
                Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)
                    Signature Hash Algorithm Hash: Unknown (8)
                    Signature Hash Algorithm Signature: SM2 (4)
                Signature Algorithm: rsa_pkcs1_sha256 (0x0401)
                    Signature Hash Algorithm Hash: SHA256 (4)
                    Signature Hash Algorithm Signature: RSA (1)
                Signature Algorithm: ecdsa_secp384r1_sha384 (0x0503)
                    Signature Hash Algorithm Hash: SHA384 (5)
                    Signature Hash Algorithm Signature: ECDSA (3)
                Signature Algorithm: rsa_pss_rsae_sha384 (0x0805)
                    Signature Hash Algorithm Hash: Unknown (8)
                    Signature Hash Algorithm Signature: Unknown (5)
                Signature Algorithm: rsa_pkcs1_sha384 (0x0501)
                    Signature Hash Algorithm Hash: SHA384 (5)
                    Signature Hash Algorithm Signature: RSA (1)
                Signature Algorithm: rsa_pss_rsae_sha512 (0x0806)
                    Signature Hash Algorithm Hash: Unknown (8)
                    Signature Hash Algorithm Signature: Unknown (6)
                Signature Algorithm: rsa_pkcs1_sha512 (0x0601)
                    Signature Hash Algorithm Hash: SHA512 (6)
                    Signature Hash Algorithm Signature: RSA (1)
        Extension: signed_certificate_timestamp (len=0)
            Type: signed_certificate_timestamp (18)
            Length: 0
        Extension: key_share (len=71)
            Type: key_share (51)
            Length: 71
            Key Share extension
                Client Key Share Length: 69
                Key Share Entry: Group: secp256r1, Key Exchange length: 65
                    Group: secp256r1 (23)
                    Key Exchange Length: 65
                    Key Exchange: 042c60dacb51f9139a814981fe52c830f990fb739ba98ac993ef19b823cfb5be2ab0371f…
        Extension: psk_key_exchange_modes (len=2)
            Type: psk_key_exchange_modes (45)
            Length: 2
            PSK Key Exchange Modes Length: 1
            PSK Key Exchange Mode: PSK with (EC)DHE key establishment (psk_dhe_ke) (1)
        Extension: supported_versions (len=7)
            Type: supported_versions (43)
            Length: 7
            Supported Versions length: 6
            Supported Version: Reserved (GREASE) (0x2a2a)
            Supported Version: TLS 1.3 (0x0304)
            Supported Version: TLS 1.2 (0x0303)
        Extension: compress_certificate (len=3)
            Type: compress_certificate (27)
            Length: 3
            Algorithms Length: 2
            Algorithm: brotli (2)
        Extension: application_settings (len=5)
            Type: application_settings (17513)
            Length: 5
            ALPS Extension Length: 3
            Supported ALPN List
                Supported ALPN Length: 2
                Supported ALPN: h2
        Extension: Reserved (GREASE) (len=1)
            Type: Reserved (GREASE) (39578)
            Length: 1
            Data: 00
        [JA3 Fullstring: 771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-,29-23-24,0]
        [JA3: 47d0fb2dc82c86701e340aa1cca4b1c1]

2 つの Client Hello を Diff してみた

変わった部分は以下です。

左が最初の Client Hello, 右が再送信する Client Hello です。

image.png

image.png

大きく変わったのは やはり key_share のところです。server側の要望に合わせてあります。共有値(Key Exchange) は変わりましたが、TLS record自体の random は変わりませんでした。つまりTLS recordのヘッダ部分と、extentionは別々に管理されているということなんだろう。このひとつのTLS handshakeとしては共通してるので、TLS recordのrandomは変わらない。

--- first.txt	2022-08-13 17:15:57.000000000 +0900
+++ second.txt	2022-08-13 17:16:41.000000000 +0900
@@ -1,11 +1,12 @@
 TLSv1.3 Record Layer: Handshake Protocol: Client Hello
     Content Type: Handshake (22)
-    Version: TLS 1.0 (0x0301)
-    Length: 512
+    Version: TLS 1.2 (0x0303)
+    Length: 332
     Handshake Protocol: Client Hello
         Handshake Type: Client Hello (1)
-        Length: 508
+        Length: 328
         Version: TLS 1.2 (0x0303)
         Random: a990959f0793ba1ff5a09d1a5eec06e87706c88ea969457fa59d9ba9dc0f0e32
         Session ID Length: 32
@@ -30,7 +31,7 @@
             Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
         Compression Methods Length: 1
         Compression Methods (1 method)
-        Extensions Length: 403
+        Extensions Length: 223
         Extension: Reserved (GREASE) (len=0)
             Type: Reserved (GREASE) (64250)
             Length: 0
@@ -93,19 +94,15 @@
         Extension: signed_certificate_timestamp (len=0)
             Type: signed_certificate_timestamp (18)
             Length: 0
-        Extension: key_share (len=43)
+        Extension: key_share (len=71)
             Type: key_share (51)
-            Length: 43
+            Length: 71
             Key Share extension
-                Client Key Share Length: 41
-                Key Share Entry: Group: Reserved (GREASE), Key Exchange length: 1
-                    Group: Reserved (GREASE) (51914)
-                    Key Exchange Length: 1
-                    Key Exchange: 00
-                Key Share Entry: Group: x25519, Key Exchange length: 32
-                    Group: x25519 (29)
-                    Key Exchange Length: 32
-                    Key Exchange: ab83faa28c812c3237c264b8d213968dadf7450bcc0c69d9f37fe6775f1fe015
+                Client Key Share Length: 69
+                Key Share Entry: Group: secp256r1, Key Exchange length: 65
+                    Group: secp256r1 (23)
+                    Key Exchange Length: 65
+                    Key Exchange: 042c60dacb51f9139a814981fe52c830f990fb739ba98ac993ef19b823cfb5be2ab0371f…
         Extension: psk_key_exchange_modes (len=2)
             Type: psk_key_exchange_modes (45)
             Length: 2
@@ -134,9 +131,5 @@
             Type: Reserved (GREASE) (39578)
             Length: 1
             Data: 00
-        Extension: padding (len=204)
-            Type: padding (21)
-            Length: 204
-            Padding Data: 000000000000000000000000000000000000000000000000000000000000000000000000…
-        [JA3 Fullstring: 771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0]
-        [JA3: cd08e31494f9531f560d64c695473da9]
+        [JA3 Fullstring: 771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-,29-23-24,0]
+        [JA3: 47d0fb2dc82c86701e340aa1cca4b1c1]

もうひとつ変わったのは TLS record version. TLS 1.0から1.2に変わっています。これは恐らく、 serverからの Hello Retry Requestが TLS1.2で返してきたからだと思われる。たぶん。

Transport Layer Security
    TLSv1.3 Record Layer: Handshake Protocol: Hello Retry Request
        Content Type: Handshake (22)
        Version: TLS 1.2 (0x0303)      <---- serverから返ってきたversion

clientは最初の client helloでは相手が tls 1.2 に対応してるかどうかもわからないので、tls1.0で始める(下位互換)風習があるんだろう。仕様もそれを許容するために、extension: supported_verions とかでversionを指定していってる昨今。

あとは 最初のClient hello と同じなので、解読はいいかな。


↓ まとめページ
https://qiita.com/uturned0/items/a24828b9b3c25c1612b0

0
0
0

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
0
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?