HTTPS的流程
# HTTPS的流程
# 1. 客户端发起请求
请求的开头,当然就是客户端发起HTTPS请求,默认发送到服务端的443
端口
# 2. 服务端提供配置
要提供HTTPS服务,服务端需要向CA机构申请数字证书。
证书内容包括:
- 证书持有者信息
- 网站的信息(域名等)
- 公钥信息
为了防止数据在传送过程中被中间人掉包,CA机构会对证书制作数字签名:
- 对明文数据data进行hash,得到哈希值(进行hash的目的:数据量很大,而hash值是固定的128位)
- 用私钥对哈希值进行加密,得到签名S
- 明文数据data和签名S共同组成了数字证书
# 3. 返回证书
服务端向客户端返回证书,其中包含了非对称加密的公钥。
在接收到证书后,客户端要验证其真实性:
- 得到证书,拿到明文数据data,签名S
- 用公钥对S进行解密,得到S'
- 对data进行hash,得到data'
- 若data' == S'则数据未被更改
同时,由于证书中包含了网站信息,客户端可以得知证书是否被中间人掉包。
# 4. 生成对称秘钥
客户端生成一个随机数X,作为后续对称加密的秘钥。
用证书中的公钥进行加密后,传递给服务端
# 5. 服务端得到对称秘钥
服务端接收到加密后的秘钥后,用自己的私钥进行解密。
至此双方都得到了一个对称加密的秘钥X,后续内容都通过X进行对称加密即可
# 对于过程的疑问
# 为什么要使用对称加密而不是直接使用非对称加密
性能问题。对称加密的性能要好很多
# 中间人可以篡改证书吗
不能。如果篡改了证书的明文数据,中间人能得到新的hash值。
但是由于没有网站的私钥,无法修改数字签名,因此会被客户端发现信息被篡改。
# 中间人可以直接掉包证书吗
不能。证书中包含了网站的信息,如果证书被掉包,客户端会发现与自己请求的域名不同
# 每次请求都要在SSL层进行握手传输秘钥吗
不需要。
服务器会为每个客户端维护一个session ID
,并传递给浏览器。
在浏览器传递来对称秘钥
时,服务器会把该秘钥存到相应的session ID
下。
之后的请求中,浏览器会携带session ID
,服务端即可找到相应的对称秘钥