tls
- 前言
- 一、TLS 协议的组成
- 二、ECDHE
- 1.连接过程
- 三、TLS1.3
- 1.过程
前言
tls是ssl协议的标准化,处于应用层(5层架构)和会话层(OSI),有着rsa方式和ecdhe两种,
一、TLS 协议的组成
握手协议:负责在客户端和服务器之间协商决定密码算法和共享密钥,包括基于证书的认证操作;
密码规格变更协议:负责向通信对象传达变更密码方式的信号,在TLS 1.3版本中不再需要该协议;
警告协议:负责在发生错误时将错误传达给对方;
记录协议:将TLS 上面承载的应用数据传达给通信对象的协议。
二、ECDHE
DH有着static DH 算法和DHE 算法。static DH 算法里服务端的密匙一般是固定不变的,有可能被用时间暴力破解出来,所以不具有前向安全性。而DHE采用ephemera临时生成私钥,保证了前向安全。ECDHE就是基于DHE算法,利用椭圆性质,更少的计算量
1.连接过程
第一次握手
- 客户端发送Client Hello
第二次握手
- 服务端发送 Server Hello;
- 服务端发送Certificate,并选择ECDHE算法发送特有的第3点
- 服务端发送Server Key Exchange,这里面包含椭圆曲线,这代表了椭圆的曲线基点G,给客户端;以及随机数作为椭圆曲线的私匙,不公布;根据基点 G 和私钥计算出服务端的椭圆曲线公钥,这个会公布给客户端。
- 服务端发送Server Hello Done 代表结束
密码套件 如「 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384」代表含义
密钥协商算法使用 ECDHE;
签名算法使用 RSA;
握手后的通信使用 AES 对称算法,密钥长度 256 位,分组模式是 GCM;
摘要算法使用 SHA384;
第三次握手
- 客户端检验证书
- 客户端生成一个随机数作为椭圆的私钥,然后再根据服务端前面给的信息,生成客户端的椭圆曲线公钥,然后用「Client Key Exchange」消息发给服务端。
- 客户端利用Client Random + Server Random + Pre-Master(ECDHE计算出来) 计算出 Master-Secret,然受发送Change Cipher Spec,改用算法
- 客户端发送Encrypted Handshake Message,对前面的信息做个摘要,验证对称钥匙是否可用
ECDHE计算过程与模幂运算类似,采用素数域下的椭圆曲线的标量乘法来实现。
(1):Client,计算Pclient = Client Random* G(基点)。将PClient发送至服务器。
(2): Server,计算PServer= Server Random * G(基点)。将PServer发送至客户端。
(3):客户端计算SClient = Client Random* PServer;服务器计算SServer = Server Random *Pclient
(4):算法保证了SClient = SServer = S,提取其中的S的Pre-Master
第四次握手
- 服务端发送Change Cipher Spec
- 服务端发送Encrypted Handshake Message
客户端可以在第三次握手后抢跑发送数据
三、TLS1.3
取消了RSA,采用DHE,不需要客户端先拿到服务器的公钥证书,不使用服务器公钥来加密要发送的预备共享密钥,只需要1-RTT甚至0-RTT,会话恢复也达到了0-RTT。 一个有趣的网站图解tls1.3
1.过程
Client Server
Key ^ ClientHello
Exch | + key_share*| + signature_algorithms*| + psk_key_exchange_modes*v + pre_shared_key* -------->ServerHello ^ Key+ key_share* | Exch+ pre_shared_key* v{EncryptedExtensions} ^ Server{CertificateRequest*} v Params{Certificate*} ^{CertificateVerify*} | Auth{Finished} v<-------- [Application Data*]^ {Certificate*}Auth | {CertificateVerify*}v {Finished} -------->[Application Data] <-------> [Application Data]
// + 代表extention项
// * 代表可选
// {} 用hashshake_key加密
// [] 用application_key加密
Client 提前将所有这些椭圆参数计算成公钥发给server
借鉴tls1.2
tls1.3