一、TSL1.2的握手过程(ECDHE举例)
- TCP三次握手
- 浏览器先发送一个”Client Hello”消息: 包含客户端版本号, 支持的密码套件和
客户端随机数(Client Random)
- 服务器返回一个”Server Hello”消息: 包含服务器版本号和一个
服务器随机数(Server Random)
, 然后会从客户端的密码套件列表中选择一个作为本次通信的密码套件 - 服务器发送”Server Certificate”消息: 为了郑明自己的身份, 会将自己的证书也发送给客户端
- 服务器发送”Server Key Exchange”消息” 包含
椭圆曲线的公钥(Server Params)
和自己私钥签名, 后边的秘钥交换做准备 - 服务器发送”Server Hello Done”消息: 表示信息发送完毕
- 这样次一个消息就通信结束, 客户端和服务器通过明文共享了三个信息:
Client Random, Server Random和Server Params
- 客户端此时拿到了服务器的证书, 会进行证书的验证, 再用证书验证步骤4中的签名, 这样就可以确认服务器的身份
- 客户端发送”Client Key Exchange”消息: 按照密码套件的要求, 客户端也会发送一个
椭圆曲线的公钥(Client Params)
给服务器
- 客户端和服务器都拿到了秘钥交换的2个参数
Client Params和Server Params
, 就会用ECDHE算法算出一个新的随机数"Pre-Master"
. 这个算法会非常复杂, 就黑客知道2个Params, 也很难算出这个随机数- 现在客户端和服务器有了三个随机数: Client Params, Server Params和Pre-Master. 用这三个随机数就可以生产用于加密回话的
主密钥"Master Secret"
. 因为黑客拿不到”Pre-Master”, 所以也得不到主密钥
- 客户端发送”Change Cipher Spec”消息: 表示之后的消息会通过主密钥加密
- 客户端发送”Finished”消息: 将之前的所有数据进行摘要加密, 让服务器验证
- 服务器同时也需要做步骤7,8给客户端验证. 此时握手正式结束, 后边收发的就是被加密的HTTP请求了
这里的认证只是客户端对服务器进行了验证, 也就是单向验证, 一些安全性更高的网站会进行双向验证. 也就是客户端也要发送自己的证书给服务器进行验证.
二、TLS1.3的握手过程
TLS1.3比1.2版本做了更多的安全优化, 废弃了很多不安全的加密套件, 同时也提升了握手性能. 具体过程如下:
- TCP三次握手
- 浏览器发送”Client Hello”消息: 比1.2更多的是, 同时发送了椭圆曲线的对应参数
- 服务器返回”Server Hello”消息: 比1.2更多的是, 同时发送了椭圆曲线的对应参数
这样, 通过一次消息, 服务器和客户端就拿到了4个共享信息: Client Random, Server Random, Client Params和Server Params. 这样双方就可以去计算”Pre-Master”和”Master Secret”, 效率比1.2提高一大截
- 服务器发送”Change Cipher Spec”消息: 比1.2更早进入的加密通信, 后边发送的证书等就是加密后的信息
- 服务器发送”Server Certificate”消息: 将证书发送客户端验证
- 服务器发送”Certificate Verify”消息: 将前边的参数统一签名, 给客户端验证. 因为加入了私钥签名, 所以强化了身份认证防篡改
- 服务器发送”Finished”消息: 将之前的所有数据进行摘要加密, 让客户端验证
- 客户端发送”Change Cipher Spec”消息: 表示之后的消息会通过主密钥加密
- 客户端发送”Finished”消息: 将之前的所有数据进行摘要加密, 让服务器验证, 此时握手正式结束.
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END