原文链接:https://blog.csdn.net/mrpre/article/details/81532469
TLS RSA: https://www.cnblogs.com/xiaolincoding/p/14274353.html
TLS ECDHE: https://www.cnblogs.com/xiaolincoding/p/14318338.html
这里简单的描述下 TLS 1.3 之前协议的秘钥交换流程,以及其缺点
RSA 秘钥交换
1:client 发起请求(Client Hello)
2:server 回复 certificate
3:client使用证书中的公钥,加密预主秘钥,发给 server(Client Key Exchange)
4:server 提取出 预主秘钥,计算主秘钥,然后发送对称秘钥加密的finished。
5:client 计算主秘钥,验证 finished,验证成功后,就可以发送Application Data了。
缺点:RSA秘钥交换不是前向安全算法(证书对应私钥泄漏后,之前抓包的报文都能被解密)。
所以在 TLS 1.3中 RSA 已经废弃了。
ECDHE秘钥交换
1:client 发送请求(Client Hello),extension携带支持的椭圆曲线类型。
2:server 回复 Server Hello和certificate等;server选择的椭圆曲线参数,然后 生成私钥(BIGNUM),乘以椭圆曲线的base point得到公钥(POINT),顺便签个名表示自己拥有证书,然后将报文发给client,报文就是Server Key Exchange,其包含了server选择的椭圆曲线参数、自己根据这个参数计算的公钥、自己用证书的私钥对当前报文的签名。
3:client 收到 Server Key Exchange,获得椭圆曲线参数,生成私钥(BIGNUM)后计算公钥(POINT),然后把公钥发出去Client Key Exchange。client使用自己的私钥(BIGNUM)和server的公钥(POINT)计算出主秘钥。
4:server 收到 client的公钥(POINT),使用自己的私钥(BIGNUM),计算主秘钥。两端主秘钥是一致。
缺点:
client发送自己支持的椭圆曲线类型,然后等待server选择后,才计算自己的公钥然后发送给server。这个可以优化。
TLS 1.3 中是这样优化握手的:
1:client 发送请求(Client Hello),extension携带支持的椭圆曲线类型。且对每个自己支持的椭圆曲线类型计算公钥(POINT)。公钥放在extension中的keyshare中。
2:server 回复 Server Hello和certificate等;server选择的椭圆曲线参数,然后乘以椭圆曲线的base point得到公钥(POINT)。然后提取Client Hello中的key_share拓展中对应的公钥,计算主秘钥。公钥(POINT)不再和之前的以协议一样放在Server Key Exchange中,而是放在Server Hello的key_share拓展中。client收到server的公钥(POINT)后计算主秘钥。
所以在TLS 1.3 中最显著的变化,也即上文说的无条件的1-RTT就是基于对握手协商的优化生。
所以,Client 相当于计算了多种可能情况下server会使用的ecdhe参数,然后根据这些参数计算公钥提前发给server = =(为了追求rtt,也是绝了),你让那种嵌入式的客户端怎么办。


2716

被折叠的 条评论
为什么被折叠?



