从真实的抓包开始
根据抓包结果可以看到
从客户端发起请求开始,主要经过以下几个过程:
1、TCP
三次握手
2、浏览器发送 Client Hello
到服务器
3、服务器发送Server Hello
、证书、证书状态、服务端密钥交换,到浏览器
4、浏览器发送 客户端密钥交换、Change Cipher Spec
、加密的握手信息,到服务端
5、服务器发送Session Ticket
、Change Cipher Spec
、加密的握手信息,到浏览器
6、之后客户端与服务器使用计算出的 master key
,通过对称加密(根据前面的密码套件,本次是 AES256 对称加密算法)开始正式https 交互
客户端的握手信息
Client Hello
包含客户端支持的所有加密套件列表、客户端的随机数等
服务端的握手信息
Server Hello
包含服务端选择的密码套件、服务端的随机数
Certificate
包含ca和目标网站证书
Certificate Status
主要是通过OSCP 查询证书状态
密钥交换过程
Server Key Exchange
这里是与RSA 算法不通的地方,在发送证书之后还会发送一次椭圆曲线的密钥
包含EC Diffie-Hellman 的公钥交换
其中EC 代表椭圆曲线算法(高版本都是短暂-椭圆曲线,ephemeral Elliptic Cure)
无论使用RSA 还是 ECDHE 做密钥交换,最终计算主密钥的公式都是如下:
client 随机数 + server 随机数 + pre-master = master secret
前两个随机数都是明文,并且通过网络传送,所以保密的关键在于 pre-master
两种密钥交换算法的区别在于
RSA 中,pre-master
单纯的由客户端生成,用服务端的 公钥加密之后发送给服务端,因为服务端有私钥,所以可以正常解密获取 pre-master
;使用这种方式做密钥交换的风险就是 一旦服务端私钥泄密,攻击者就可以 解密出 pre-master
加上监听获取到的 前两个随机数,就可以计算出 master secret
。(所以说RSA 不具备PFS -perfect forward secrecy 完美前导性安全)
ECDHE 中,服务端临时生成 椭圆曲线EC 的公私钥对 Server Params
,发送公钥给客户端;
客户端也生成一个 椭圆曲线EC 的公私钥对 Client Params
,发送公钥给服务端,而私钥分别由客户端、服务端保管,随后分别在本地计算 pre-master
。 如果服务端私钥泄露,但是无法拿到客户端和服务端 椭圆曲线的私钥,也是没办法进行破解工作。(因此 ECDHE 具备PFS -perfect forward secrecy 完美前导性安全)
ECDHE (ephemeral Elliptic Cure Diffie-Hellman Exchange)全称 临时椭圆曲线DH 交换算法,其中DH 就是两个人名缩写。
Client Key Exchange
包含EC Diffie-Hellman 的公钥交换
客户端首先通过 Server Params 和自己的私钥,计算出 pre-master
再结合前面2个随机数计算出 master secret
最后用计算出的 master secret
加密一段校验信息发送给服务端
New Session Ticket
session ticket 是tls1.2 引入的机制,用于替换session id
同时 服务端使用客户端发来的 Client Params 和自己的私钥,计算出 pre-master
再结合前面2个随机数计算出 master secret
最后用计算出的 master secret
加密一段校验信息发送给客户端