一、資源 TLS1.3 正式版本還未發(fā)布,截止2018-4-26日為止,草案版本為28,URL為: https://datatracker.ietf.org/doc/draft-ietf-tls-tls13/ ,網(wǎng)站截圖: TLS1.3草案 openssl早已開(kāi)始支持TLS1.3協(xié)議,目前最新版本為 openssl-1.1.1-pre5。感興趣的同學(xué)可以一起來(lái)研究一下。
二、搭建環(huán)境 2.1編譯安裝 ./config -d --prefix=/usr/local/openssl-1.1.1-pre5 make make install 加-d參數(shù)是為了gdb調(diào)試。 2.2 建立CA 并發(fā)兩張證書(shū) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl-1.1.1-pre5/lib export PATH=$PATH:./ cd /usr/local/openssl-1.1.1-pre5/ssl/misc cp .././../bin/openssl . ./CA.pl -newca ./openssl req -newkey rsa:1024 -keyout s.key -out sreq.pem ./openssl req -newkey rsa:1024 -keyout c.key -out creq.pem ./openssl ca -in sreq.pem -out s.pem ./openssl ca -in creq.pem -out c.pem 啟動(dòng)服務(wù)端:
./openssl s_server -tls1_3 -CAfile demoCA/cacert.pem -cert s.pem -key s.key -cipher TLS_AES_256_GCM_SHA384 -state -Verify 1 啟動(dòng)客戶端: ./openssl s_client -tls1_3 -CAfile demoCA/cacert.pem -cert c.pem -key c.key -cipher TLS_AES_256_GCM_SHA384 -state 環(huán)境搭建完畢。 三、研究?jī)?nèi)容 學(xué)習(xí)總需要有一個(gè)切入點(diǎn),采用哪個(gè)? 順便選一個(gè)吧:對(duì)稱密鑰是如何生成的?先看理論: 完整握手過(guò)程 這是一個(gè)典型的非常完整的握手過(guò)程,這里只顯示了網(wǎng)絡(luò)上的消息,我們把客戶端和服務(wù)端內(nèi)部要處理的 過(guò)程也做標(biāo)記,如下圖,紅色為交互的消息,藍(lán)色為后臺(tái)處理。 收發(fā)消息及其處理 再進(jìn)一步,我們將每條消息加密的密鑰標(biāo)出來(lái),這里涉及4個(gè)密鑰: 握手過(guò)程-服務(wù)端寫(xiě)密鑰(keyA)、握手過(guò)程-服務(wù)端讀密鑰(keyB)、應(yīng)用-服務(wù)端寫(xiě)密鑰(keyC)、應(yīng)用-服務(wù)端讀密鑰(keyD)。如下圖所示: 密鑰產(chǎn)生及標(biāo)注 setup密鑰會(huì)調(diào)用 tls13_enc.c 的 tls13_change_cipher_state 函數(shù),可以將斷點(diǎn)定在
tls13_change_cipher_state 函數(shù),執(zhí)行上面的兩條命令(s_client和s_server)來(lái)確定客戶端和服務(wù)端分別在哪個(gè)階段啟用了哪個(gè)密鑰。 tls13_change_cipher_state函數(shù)大體上不復(fù)雜,簡(jiǎn)化如下(未研究early data,只與上面過(guò)程匹配): 密鑰啟用 感興趣的話,可以自己gdb一下,既可以熟悉源碼,也可以熟悉協(xié)議。
|