1、背景
Https
并不是一个新协议,只是在Http
协议的基础上使用了TLS
/SSL
协议。TLS
是一种密码学协议,保障会话
的相对安全; 会话
是由任意数量的消息组成的。有点网络常识的人都知道,Http
在传输中使用的是明文的方式,中间方可以通过抓包的方式获取到报文,获取到传输的信息。这样的传输方式很明显在当下的网络环境不适用,那Https
做了什么优化,让会话变得相对安全呢。
1.2、密码协议
1.2.1 对称加密
待补充
1.2.2 非对称加密
待补充
1.2.3 总结
Https
的使用了上述两种加密方式,保证会话
安全即加密
消息。那么Https
是如何通信的呢?我们借助OSI
网络模型来进一步探索。
2、OSI 七层网络模型
以这种方式安排通信有以下两种好处:
- 不同层次的协议可以加入通信或者从通信中删除
- 一种底层协议可以服务多种上层协议
从上图可以看出SSL/TLS
协议,基于TCP
协议之上,当我们不需要加密的时候 (Http
),可以将TLS
从模型中删除。当需要加密的时候我们可以使用TLS
进行加密,就可以利用TLS
对Http
加密。
2.1 TLS
TLS
是以记录协议实现的。记录协议负责传输连接上的交换的所有底层信息,并以配置加密。
TLS
中有四个核心子协议握手协议
(handshake protocol),密钥规格变更协议
(change cliper spec protocol),应用数据协议
(application data protocol)、警报协议
(alert protocol)
2.2、握手协议
握手时 TLS
协议中最精密复杂的部分。该过程中,双方协商连接参数,并且完成身份验证。根据使用的功能不同,整个过程中需要交换6~10条消息。
2.2.1 完整的握手
如果客户端此前并未和服务端建立会话,那么双方会执行一次完整的流程来协商TLS
会话
此处的握手流程我们以不需要身份验证的客户端和需要身份验证的服务端开始,大致流程如下。
1、客户端发送消息,将自身支持的功能发送给服务端。
2、服务端选择连接参数
3、服务端发送证书链(仅当需要验证服务器身份的时候)
4、根据选择密钥的方式,服务器发送生成主密钥需要的额外信息
5、服务端通知客户端完成了协商过程
6、客户发送生成主密钥所需要的额外信息
7、客户端切换加密方式并通知服务端
8、客户端计算和接收的握手信息的Mac并发送
9、服务器切换加密方式并通知客户端
10、服务器计算发送和接收到的握手信息的Mac并发送
2.2.2clientHello
消息中主要包含协议版本
(TLS版本号), Random
(随机数1),ciper suite密码套件
(支持的加密套件), sessionID
(为空的回话ID)
2.2.3serverHello
消息中主要包含和协议版本
(TLS版本号),Random
(随机数2),指定的密码套件
,sessionId
会话ID
2.2.4certificate
服务器发送证书链,这是一系列证书。主要发送主证书中间证书。主证书一般是CA认证的证书,证书中包含公钥和私钥。这个是可选消息奥。并非所有客户端都需要验证服务端身份的。
2.2.5serverKeyExchange
携带密钥交换的额外数据。不同协商的算法都有差异。
2.2.6serverHelloDone
表明服务端已经将所有预计的握手信息发完
2.2.7ClientKeyExchange
ClientKeyExchange消息携带客户端为密钥交换提供的所有信息
2.2.8ChangeCipherSpec
ChangeCipherSpec消息表明发送端已取得用以生成连接参数的足够信息,已生成加密密钥,
并且将切换到加密模式
2.2.9Finished
表明握手已经完成
2.3 会话恢复
2.4 SSL其它协议等待补充。
3.1https 握手的过程
1、clientHello
发送消息给服务端支持的协议版本,加密套装组件,随机数1,空sessionid。
2、clientHello
发送消息给客户端包含协议版本,选定的加密组件方式,随机数2
3、certificate
发送能验证服务端身份的主证书和中间证书,主要表明服务器身份
4、serverKeyExchange
服务端发送,公钥给客户端
5、serverHelloDone
服务端告诉client 已收到预计需要的所有握手消息
6、clientKeyExchange
客户端该过程中将生成预主密钥
,并使用步骤3
提供的公钥
对预主密钥加密。并将密钥塞在publicKey
字段中.
7、changeCipherSpec
表明消息表明发送端已取得用以生成连接参数的足够信息,已生成加密密钥,并且将切换到加密模式。客户端和服务器在条件成熟时都会发送这个消息。
服务端收到密钥后
,使用私钥
对密钥
解密获得预主密钥
,然后在根据随机数1+随机数2+预主密钥
得到会话密钥
与客户端的会话密钥
是一致的
8、finished
表明TLS握手
协商的过程结束
BTW
S4
交换的是公钥
,S6
过程中预主密钥
是采用交换的公钥
加密的,因为非对称解密是需要私钥
来解密的只要服务端保存好私钥
,中间人获得的机密后的预主密钥
也是无法解密的。故在S7
的过程中,服务端
通过私钥
解密获得预主密钥,然后在和随机数1,2一同计算出会话密钥,和客户端的会话密钥是一致的。故在握手完成后的S8
双方将使用会话密钥
对报文进行对称加密,中间放得到报文,也是无法解密的。