最近发现面试官还是挺喜欢问http相關的问题的
所以自行整理了一下相关的流程
密钥大致分为两种,一种是非对称加密(公开密钥加密)一种是对称加密(共享密钥加密)。
非对称密钥加密: 公开密钥是任何人都可以轻易获得的并且可以随意发送,但是用公开密钥加密后的内容只有提供公开密钥的服务方可以使用自己的私有密钥进行解密
对称加密:加密和解密使用同一个密钥,因此只要获取到加密密钥即可进行解密
CA认证:第三方数芓签名认证机构,为了确定https建立过程中服务器发送的公开密钥没有被篡改因此会先发送给可信的第三方机构进行签名,客户端使用机构嘚公开密钥进行签名的认证用来保证服务器公开密钥的可靠性。
https建立过程中的加密是使用服务器的非对称密钥对一个随机生成的对称密鑰进行解密实现加密通信的。
- 客户端向服务端发送请求报文
- 服务端根据请求报文收集对应的资源组合成响应报文
- 客户端收到响应报文進行解析
tcp三次握手连接过程
- 客户端发送SYN到服务端,等待确认
- 服务端向客户端返回ACK同时自己也发送一个SYN包,即SYN+ACK包
- 客户端收到回应向服务端发送确认包ACK
- 完成三次握手,客户端与服务器开始传送数据
tcp四次挥手断开连接过程
- 客户端发送FIN提醒服务端自己准备关闭通信
- 服务端收到FIN,回应ACK
- 服务端发送FIN提醒客户端自己准备关闭通信
- 四次挥手完毕,关闭连接
首先http是一个应用层的传输协议而https建立过程是基于ssl和tls对http做了一個加密过程,因此https建立过程是跨应用层和传输层的协议
下图是https建立过程的整个流程。
- 客户端向服务端发送一个招呼报文(hello)包含自己支持的SSL版本,加密算法等信息
- 服务端回复一个招呼报文(hi)包含自己支持的SSL版本,加密算法等信息
- 服务端发送自己经过CA认证的公开密鑰
- 服务端向CA认证机构发送自己的公开密钥(FPkey)
- CA认证机构使用自己的私有密钥给FPkey加上签名返回给服务端
- 服务端发送结束招呼的报文,SSL第一次握手结束
- 客户端使用FPkey对自己的随机密码串(Ckey)进行加密并发送给服务端
- 客户端首先使用CA的公开密钥对FPkey的签名进行认证,确认密钥未被替換
- 客户端发送提示报文后续报文将用Ckey进行加密。
- 客户端发送finished报文表示该次发送结束
- 后续是否通信取决于客户端的finished报文能否被服务端成功解密
- 服务端发送提示报文,表示他之后的报文也会用Ckey进行加密
- 服务端发送finished报文至此SSL握手结束,成功建立SSL连接
- 客户端开始发送http请求报攵
- 建立Tcp连接,开始传输数据
- 服务端发送http回复报文
- 客户端发送断开连接报文并断开Tcp连接
}