這種 TLS 1.2 客戶端完成消息方法可能有什麼問題?
有人可以確保我正確地創建了我的客戶端完成消息,因為我已經工作了好幾天,並且不斷收到錯誤記錄 MAC 錯誤,我不知道我做錯了什麼。
- 第一步是創建 12 字節的驗證數據。這是使用帶有主密鑰、標籤“客戶端完成”和所有先前握手消息的 sha256 摘要的 PRF 創建的。(密碼套件是 TLS_RSA_WITH_AES_256_CBC_SHA256)。
- 然後將這 12 個字節放入具有握手類型欄位和 3 字節長度欄位的完成握手記錄中。
- 這 16 個字節然後通過 sha256 HMAC 傳遞,該 HMAC 作為輸入:
- 序列號(對於完成的消息,這是數字 3,因為前 3 條消息是客戶端問候、客戶端密鑰交換和更改密碼規範)
- 類型 - 0x14
- 版本 - 0x0303
- 長度 -16
- “純文字數據”的 16 個字節
- 這會產生 32 個字節的雜湊值,這些雜湊值被標記到 16 個字節的數據上,在填充之前創建 48 個字節(如果包含填充長度欄位,則為 49 個字節)。所以我們添加了 15 個字節的填充,值為 0x0F。這使總長度達到 64 個字節(塊大小 16 的倍數)。
- 然後使用 IV 和客戶端寫入密鑰對 64 個字節進行加密。
- 前面是 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- ...=.}..