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 ciper 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. 浏览器中输入一段网址究竟发生了什么?
我们这么考虑,网址和主机如何映射。那么就有了第一步DNS 解析。找到了主机的ip地址后我们如何通信,我们使用何种协议通信https ,http 。那么协议清楚了,基于OSI 7层网络模型我们就知道了,需要建立通信(TCP/UDP)此处我们使用的协议是基于TCP 的,故我们有了第二步建立TCP连接,那么就有了TCP的三次握手,因https 是需要加密的故基于SSL 的握手过程和http不同,将上述的SSL 握手的过程表述出来即可,那么关于信道 连接好了,我们就可以发网络请求了。也就有了我们的第三部 网络请求,然后服务端应答也就有了我们的第四步页面渲染 。若页面中还包含一些其它资源又会出现网络请求 ,页面渲染完毕后我们将关闭通信信道,也就又了我们的第五部关闭TCP 连接
3.1https 握手的过程
1、clientHellow 发送消息给服务端支持的协议版本,加密套装组件,随机数1,空sessionid。 2、clientHellow 发送消息给客户端包含协议版本,选定的加密组件方式,随机数2 3、certificate 发送能验证服务端身份的主证书和中间证书,主要表明服务器身份 4、serverKeyExchange 服务端发送,公钥给客户端 5、serverHelloDone 服务端告诉client 已收到预计需要的所有握手消息 6、clientKeyExchange 主要是客户端将随机数2用服务端提供的公钥加密,生成预主密钥。并将密钥塞在publickey字段中 7、服务端收到预主密钥后,将随机数1和随机数2和预主密钥加密过后等到回话密钥。 8、发送完成的信息。
这里面的过程值得注意,服务端交换的是公钥,此处是使用的非对称加密方式。即server 持有成对的公私钥,使用公钥加密就必须使用私钥解密,使用私钥加密就得使用公钥加密。
为什么说https使用的是非堆成和对称加密呢。其实建立tcp连接获取取会话密钥的过程是非对称称加密。成功之后就会使用,会话密钥来加密数据了。
|