Tls

這種 TLS 1.2 客戶端完成消息方法可能有什麼問題?

  • January 26, 2021

有人可以確保我正確地創建了我的客戶端完成消息,因為我已經工作了好幾天,並且不斷收到錯誤記錄 MAC 錯誤,我不知道我做錯了什麼。

  1. 第一步是創建 12 字節的驗證數據。這是使用帶有主密鑰、標籤“客戶端完成”和所有先前握手消息的 sha256 摘要的 PRF 創建的。(密碼套件是 TLS_RSA_WITH_AES_256_CBC_SHA256)。
  2. 然後將這 12 個字節放入具有握手類型欄位和 3 字節長度欄位的完成握手記錄中。
  3. 這 16 個字節然後通過 sha256 HMAC 傳遞,該 HMAC 作為輸入:
  • 序列號(對於完成的消息,這是數字 3,因為前 3 條消息是客戶端問候、客戶端密鑰交換和更改密碼規範)
  • 類型 - 0x14
  • 版本 - 0x0303
  • 長度 -16
  • “純文字數據”的 16 個字節
  1. 這會產生 32 個字節的雜湊值,這些雜湊值被標記到 16 個字節的數據上,在填充之前創建 48 個字節(如果包含填充長度欄位,則為 49 個字節)。所以我們添加了 15 個字節的填充,值為 0x0F。這使總長度達到 64 個字節(塊大小 16 的倍數)。
  2. 然後使用 IV 和客戶端寫入密鑰對 64 個字節進行加密。
  3. 前面是 16 字節 IV 的 64 字節被發送到伺服器 - 總共 80 字節。

我究竟做錯了什麼?

編輯

謝謝大佬指點!不知道為什麼我沒有想過調試另一個實現來找出我哪裡出錯了。原來我用來計算我的 SHA256 HMAC 的庫(我使用的是 Nettle)有點錯誤。我導入了另一個庫並設法讓它全部工作!

CCS 處的sequence_number重置,因此Finished為零(8 個字節)。握手的記錄類型也是 0x16,要明確記錄長度是 2 個字節,在這種情況下是 00 10,並且“IV”對於每條記錄應該是隨機的。作為助記符,RHUL 組的幸運十三攻擊使用了 HMAC 偽標頭為 13 個字節的事實。

也就是說,我同意@Maarten 的評論:針對另一個實現進行調試。尤其是像 OpenSSL/LibreSSL/BoringSSL 或 GnuTLS 或 Java 這樣的開源軟體。

首先,對照官方測試向量檢查您使用的所有算法。這解決了大部分問題,包括您描述的 TLS 1.2 客戶端完成消息的問題。您的問題不是方法,而是在計算鏈中計算的實際數據。要找出計算錯誤的確切步驟,請將測試向量和中間值(premaster secret 等)與 TLS 的其他實現(如 OpenSSL)進行比較。

除了 dave_thompson_085 的回答之外,這裡還有一個關於如何調試 OpenSSL 的實用建議。

OpenSSL 已經實現了一種機制,允許您通過在螢幕上顯示這些值來跟踪各種 TLS 內部值,例如 Premaster Secret、Client Random、Server Random、Master Secret、Mac Key、Encryption Key 等。

預設情況下,OpenSSL 庫是在禁用跟踪的情況下建構的。因此,要使用跟踪功能,必須使用“啟用跟踪”選項配置和建構 OpenSSL。還有另一個建構選項“enable-ssl-trace”,它為“openssl s_client”和“openssl s_server”添加了“-trace”命令行參數,但是當您編寫自己的 TLS 實現時,此選項不是很有用,因為它只顯示“s_client”和“s_server”的附加數據,而不是像鍵塊這樣的 TLS 內部值。

在建構 OpenSSL 時,將“enable-trace”參數添加到“Configure”。例如,對於 64 位 Windows,呼叫:

perl Configure enable-trace enable-ssl-trace VC-WIN64A
nmake

然後,“openssl.exe”將從OPENSSL_TRACE環境變數中讀取跟踪選項。此變數接受以逗號分隔的跟踪類別列表。

ALL
TRACE
INIT
TLS
TLS_CIPHER
CONF
ENGINE_TABLE
ENGINE_REF_COUNT
PKCS5V2
PKCS12_KEYGEN
PKCS12_DECRYPT
X509V3_POLICY
BN_CTX
STORE

要跟踪 TLS 內部值,您只需將TLS類別指定為OPENSSL_TRACE. 例如:

set OPENSSL_TRACE=TLS
openssl.exe s_server

它將開始接受埠 4433 上的 TLS 連接。使用您的客戶端連接到它,您將在控制台上看到如下跟踪數據:

TRACE[28:25:00:00]:TLS: Premaster Secret:
TRACE[28:25:00:00]:TLS:     0000 - 00 86 80 fa 69 b4 42 1d-e6 4b 20 b0 ca 42 6a 38   ....i.B..K ..Bj8
TRACE[28:25:00:00]:TLS:     0010 - f9 48 38 5b a1 1b e2 8e-6a 8f 4e 23 28 4b 9f 79   .H8[....j.N#(K.y
TRACE[28:25:00:00]:TLS:     0020 - ac 74 7d c3 4c 9d ba 0f-25 f2 97 89 3c ae 55 48   .t}.L...%...<.UH
TRACE[28:25:00:00]:TLS:     0030 - 92 df 77 4a 20 4e d8 a3-85 64 1e 35 55 72 c4 b5   ..wJ N...d.5Ur..
TRACE[28:25:00:00]:TLS:     0040 - a3 52                                             .R
TRACE[28:25:00:00]:TLS: Client Random:
TRACE[28:25:00:00]:TLS:     0000 - 5e 5c 2f 41 f4 8d 66 46-d7 fa 2d d2 16 2d 0d 31   ^\/A..fF..-..-.1
TRACE[28:25:00:00]:TLS:     0010 - de f5 5a 53 91 86 48 a7-ec af 9d 0c 16 03 d2 ec   ..ZS..H.........
TRACE[28:25:00:00]:TLS: Server Random:
TRACE[28:25:00:00]:TLS:     0000 - 78 9c 50 33 93 38 70 f7-77 d6 43 5f be 20 4d 08   x.P3.8p.w.C_. M.
TRACE[28:25:00:00]:TLS:     0010 - c6 52 67 0d 8c 89 b0 0c-44 4f 57 4e 47 52 44 01   .Rg.....DOWNGRD.
TRACE[28:25:00:00]:TLS: Master Secret:
TRACE[28:25:00:00]:TLS:     0000 - 1f 5d bd 13 92 b9 34 ef-24 dc ee 2f 60 76 82 16   .]....4.$../`v..
TRACE[28:25:00:00]:TLS: 0010 - 0c a7 db 51 2a 69 46 23-8d 64 75 72 71 24 81 d1 ...Q*iF#.durq$..
TRACE[28:25:00:00]:TLS:     0020 - 52 3c 1a 68 9a d8 4a 00-38 5d 95 84 05 14 4f 69   R<.h..J.8]....Oi
TRACE[28:25:00:00]:TLS: dec 1
TRACE[28:25:00:00]:TLS:     0000 - 01                                                .
TRACE[28:25:00:00]:TLS: client random
TRACE[28:25:00:00]:TLS:     0000 - 5e 5c 2f 41 f4 8d 66 46-d7 fa 2d d2 16 2d 0d 31   ^\/A..fF..-..-.1
TRACE[28:25:00:00]:TLS:     0010 - de f5 5a 53 91 86 48 a7-ec af 9d 0c 16 03 d2 ec   ..ZS..H.........
TRACE[28:25:00:00]:TLS: server random
TRACE[28:25:00:00]:TLS:     0000 - 78 9c 50 33 93 38 70 f7-77 d6 43 5f be 20 4d 08   x.P3.8p.w.C_. M.
TRACE[28:25:00:00]:TLS:     0010 - c6 52 67 0d 8c 89 b0 0c-44 4f 57 4e 47 52 44 01   .Rg.....DOWNGRD.
TRACE[28:25:00:00]:TLS: master key
TRACE[28:25:00:00]:TLS:     0000 - 1f 5d bd 13 92 b9 34 ef-24 dc ee 2f 60 76 82 16   .]....4.$../`v..
TRACE[28:25:00:00]:TLS: 0010 - 0c a7 db 51 2a 69 46 23-8d 64 75 72 71 24 81 d1 ...Q*iF#.durq$..
TRACE[28:25:00:00]:TLS:     0020 - 52 3c 1a 68 9a d8 4a 00-38 5d 95 84 05 14 4f 69   R<.h..J.8]....Oi
TRACE[28:25:00:00]:TLS: key block
TRACE[28:25:00:00]:TLS:     0000 - a0 0e 22 a5 56 fc 7a 20-88 0d 50 61 24 60 73 27   ..".V.z ..Pa$`s'
TRACE[28:25:00:00]:TLS: 0010 - 99 cb 03 48 db 27 12 80-7d d9 e6 bc 98 a9 90 e1 ...H.'..}.......
TRACE[28:25:00:00]:TLS: 0020 - 12 72 4d 76 04 c1 b6 d4-5b a8 98 e7 12 de 82 43 .rMv....[......C
TRACE[28:25:00:00]:TLS: 0030 - e7 21 bd 6c ba cc 65 1a-03 28 9a ac d4 00 0d 50 .!.l..e..(.....P
TRACE[28:25:00:00]:TLS: 0040 - 75 b3 bb 7f 6f f1 f7 28-5d cd cd d8 2f 8e 1b 21 u...o..(].../..!
TRACE[28:25:00:00]:TLS: 0050 - 8a fd bd 6b b6 3a dc 85- ...k.:..
TRACE[28:25:00:00]:TLS: which = 0021, mac key:
TRACE[28:25:00:00]:TLS: which = 0021, key:
TRACE[28:25:00:00]:TLS: 0000 - a0 0e 22 a5 56 fc 7a 20-88 0d 50 61 24 60 73 27 ..".V.z ..Pa$`s'
TRACE[28:25:00:00]:TLS:     0010 - 99 cb 03 48 db 27 12 80-7d d9 e6 bc 98 a9 90 e1   ...H.'..}.......
TRACE[28:25:00:00]:TLS: iv:
TRACE[28:25:00:00]:TLS:     0000 - 75 b3 bb 7f                                       u...
TRACE[28:25:00:00]:TLS: dec 40
TRACE[28:25:00:00]:TLS:     0000 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
TRACE[28:25:00:00]:TLS:     0010 - 00 00 00 00 00 00 00 00-5d b0 62 5e 16 39 df 82   ........].b^.9..
TRACE[28:25:00:00]:TLS:     0020 - 02 9d d2 3d 19 7d 07 8f-                          ...=.}..

引用自:https://crypto.stackexchange.com/questions/28948