目录
简介
HTTPS 全称 「HTTP Secure」/「HTTP over SSL」「HTTP over TLS」。
SSL(Sercure Socket Layer) 是 TLS(Transport Layer Secure) 的前身。
TLS 是在 HTTP 所在的应用层和传输层之间增加的一个安全层,用于保障 HTTP 安全传输。
HTTP 和 TLS 组合起来就是 HTTPS。所以 HTTPS 不是一个新的协议,而是对 HTTP 的包装。
为什么要用 HTTPS
为了应对 HTTP 存在的以下问题,所以要用 HTTPS:
- HTTP 通过明文通信,内容可能会被窃取;
- HTTP 不验证通信方的身份,可能遭遇伪装;
- HTTP 无法证明报文的完整性,可能遭到篡改。
HTTPS 的工作原理
用一句话来概括 HTTPS 的工作原理就是:
发送正式消息之前,在客户端和服务器之间用「非对称加密」协商出一套「对称加密」的密钥;正式发送消息时使用「对称加密」将内容加密,接收方收到消息后再解密。
为什么不之间用非对称加密?
由于⾮对称加密使⽤了复杂的数学原理,因此计算相当复杂,如果完全使⽤⾮对称加密来加密通信内容,会严重影响⽹络通信的性能。
HTTPS 建立连接的过程
HTTPS 建立连接的过程由 TLS 层实现。
大致流程:
- 客户端请求建立 TLS 连接;
- 服务器返回目标地址的证书;
- 客户端对证书进行验证;
- 客户端对证书验证通过后,用非对称加密通信与服务器协商出发送正式消息所需的对称加密算法的密钥
- 使用对称加密算法加密消息通信
详细过程:
1、客户端发起请求(Client Hello),包含以下内容:
- 1 个字节的数据
- 客户端支持的 TLS 版本集合
- 客户端支持的 Cipher Suite(加密套件:用哪些算法加密[对称/非对称/Hash])
- 客户端产生的一个随机数(为了方便区分,我们定义它为 A)
2、服务器响应并返回(Server Hello),返回内容包含:
- 1 个字节的数据
- 服务器选定的 TLS 版本
- 服务器选定的加密算法
- 服务器产生的一个随机数(B)
3、服务器发送证书,证书内容如下:
假如在第 1 步发送建立请求过程中,消息被拦截,并返回一个非目标服务器的但又合法的证书。客户端会在接收到证书后,校验证书的主机名是否是要访问的目标地址。这样就可以防治身份伪造了。
4、客户端生成一个随机数发送给服务器:
到这一步客户端已经对服务器足够信任了。
客户端再生成一个随机数并用服务器返回的证书的公钥加密后发给服务端。这个随机数叫:Pre-master Secret
。
第一步和第二步的非加密请求与响应过程中的两个随机数都是明文传输,可能被中间网络截获,而这一步的随机数因为用了非对称加密,所以不必担心被截获。
现在,客户端和服务器都有三个随机数(A、B 和 Pre-master Secret),它们用相同的算法,利用这三个随机数就可以计算出相同的一个密钥,这个密钥叫 Master Secret
。
接下来,就可以用 Master Secret
来计算出四个密钥。
- 客户端加密密钥
- 服务器加密密钥
- 客户端 MAC Secret
- 服务器 MAC Secret
什么是 MAC Secret?
它是 HMAC secret。HMAC 全称:Hash-based message authenticate code。用于对数据进行 Hash 时,相当于是盐。
既然是对称加密,为什么客户端和服务器要用不同的加密密钥?
防止消息被直接回传。比如:客户端发送的数据被中间人截获并直接返回,因为数据是用客户端加密密钥加密,而客户端收到服务器的所有消息都要用服务器加密密钥解密,所以客户端收到被截获并直接返回的消息后,根本无法正常解密,避免被干扰。
5、客户端通知服务器:将使用加密通信
6、客户端发送加密数据
将 1- 5 步中的信息用客户端加密密钥加密并计算 Hash(配合客户端的 MAC Secret) 后发给服务端,确保服务端能解密。
7、服务端通知客户端:将使用加密通信
8、服务端发送加密数据
将 1-7 步中的信息用服务器的加密密钥加密并计算 Hash(配合服务器的 MAC Secret)后发给客户端,确保客户端可以解密。
接下来,客户端与服务端就可以通过对称加密进行通信了。
在 Android 中使⽤ HTTPS
正常情况:直接使⽤ https 的地址。
需要⾃⼰写证书验证过程的场景:
- ⽤的是⾃签名证书(例如只⽤于内⽹的 https)
- 证书信息不全,缺乏中间证书机构(可能性不⼤)
- ⼿机操作系统较旧,没有安装最新加⼊的根证书