一、资源 TLS1.3 正式版本还未发布,截止2018-4-26日为止,草案版本为28,URL为: https://datatracker.ietf.org/doc/draft-ietf-tls-tls13/ ,网站截图: TLS1.3草案 openssl早已开始支持TLS1.3协议,目前最新版本为 openssl-1.1.1-pre5。感兴趣的同学可以一起来研究一下。
二、搭建环境 2.1编译安装 ./config -d --prefix=/usr/local/openssl-1.1.1-pre5 make make install 加-d参数是为了gdb调试。 2.2 建立CA 并发两张证书 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 启动服务端:
./openssl s_server -tls1_3 -CAfile demoCA/cacert.pem -cert s.pem -key s.key -cipher TLS_AES_256_GCM_SHA384 -state -Verify 1 启动客户端: ./openssl s_client -tls1_3 -CAfile demoCA/cacert.pem -cert c.pem -key c.key -cipher TLS_AES_256_GCM_SHA384 -state 环境搭建完毕。 三、研究内容 学习总需要有一个切入点,采用哪个? 顺便选一个吧:对称密钥是如何生成的?先看理论: 完整握手过程 这是一个典型的非常完整的握手过程,这里只显示了网络上的消息,我们把客户端和服务端内部要处理的 过程也做标记,如下图,红色为交互的消息,蓝色为后台处理。 收发消息及其处理 再进一步,我们将每条消息加密的密钥标出来,这里涉及4个密钥: 握手过程-服务端写密钥(keyA)、握手过程-服务端读密钥(keyB)、应用-服务端写密钥(keyC)、应用-服务端读密钥(keyD)。如下图所示: 密钥产生及标注 setup密钥会调用 tls13_enc.c 的 tls13_change_cipher_state 函数,可以将断点定在
tls13_change_cipher_state 函数,执行上面的两条命令(s_client和s_server)来确定客户端和服务端分别在哪个阶段启用了哪个密钥。 tls13_change_cipher_state函数大体上不复杂,简化如下(未研究early data,只与上面过程匹配): 密钥启用 感兴趣的话,可以自己gdb一下,既可以熟悉源码,也可以熟悉协议。
|