HTTPS的流程

Youky ... 2021-10-11 计算机网络
  • 应用层
  • HTTPS
About 2 min

# HTTPS的流程

# 1. 客户端发起请求

请求的开头,当然就是客户端发起HTTPS请求,默认发送到服务端的443端口

# 2. 服务端提供配置

要提供HTTPS服务,服务端需要向CA机构申请数字证书

证书内容包括:

  • 证书持有者信息
  • 网站的信息(域名等)
  • 公钥信息

为了防止数据在传送过程中被中间人掉包,CA机构会对证书制作数字签名:

  1. 对明文数据data进行hash,得到哈希值(进行hash的目的:数据量很大,而hash值是固定的128位)
  2. 用私钥对哈希值进行加密,得到签名S
  3. 明文数据data和签名S共同组成了数字证书

# 3. 返回证书

服务端向客户端返回证书,其中包含了非对称加密的公钥。

在接收到证书后,客户端要验证其真实性:

  1. 得到证书,拿到明文数据data,签名S
  2. 用公钥对S进行解密,得到S'
  3. 对data进行hash,得到data'
  4. 若data' == S'则数据未被更改

同时,由于证书中包含了网站信息,客户端可以得知证书是否被中间人掉包。

# 4. 生成对称秘钥

客户端生成一个随机数X,作为后续对称加密的秘钥。

用证书中的公钥进行加密后,传递给服务端

# 5. 服务端得到对称秘钥

服务端接收到加密后的秘钥后,用自己的私钥进行解密。

至此双方都得到了一个对称加密的秘钥X,后续内容都通过X进行对称加密即可

# 对于过程的疑问

# 为什么要使用对称加密而不是直接使用非对称加密

性能问题。对称加密的性能要好很多

# 中间人可以篡改证书吗

不能。如果篡改了证书的明文数据,中间人能得到新的hash值。

但是由于没有网站的私钥,无法修改数字签名,因此会被客户端发现信息被篡改。

# 中间人可以直接掉包证书吗

不能。证书中包含了网站的信息,如果证书被掉包,客户端会发现与自己请求的域名不同

# 每次请求都要在SSL层进行握手传输秘钥吗

不需要。

服务器会为每个客户端维护一个session ID,并传递给浏览器。

在浏览器传递来对称秘钥时,服务器会把该秘钥存到相应的session ID下。

之后的请求中,浏览器会携带session ID,服务端即可找到相应的对称秘钥

Last update: October 11, 2021 16:57
Contributors: youky7