握手阶段 (Handshake Phase) :
- 客户端发送数据给服务器建立SSL连接:客户端向服务器发送一个支持TLS版本的请求。
- 服务器选择加密算法和证书:服务器收到客户端发送过来的请求,把自己的数字证书返回给客户端。数字证书包含公钥和域名等信息,客户端可以用来验证服务器的身份。
- 客户端验证服务器的身份:客户端收到服务器发送的数字证书,判断证书是否合法,证书的域名与自己请求地址是否匹配,如果验证通过生成一个随机的对称秘钥,并使用证书的公钥对其加密后,再发给服务器。
- 服务器解密客户端发送的随机秘钥:服务器收到客户端加密后数据,使用私钥解开,拿到随机秘钥进行下一步的数据传输。
加密数据传输阶段:
- 对称加密通信:一旦客户端和服务器都有了相同的随机秘钥,他们就可以使用对称加密算法来加密和解密通信了。
- 数据完整性验证:在加密后,SSL/TLS会使用HMAC算法对数据生成一个摘要(固定长度的秘钥),接收方收到数据后也会使用此算法来生成摘要,如果2个摘要相匹配则说明数据并没有被篡改。
连接终止阶段 (Connection Termination Phase) :
- 通信结束后客户端会发送给服务器告诉它,不再发送信息要关闭连接了。
- 服务器收到关闭请求,会告诉客户端我收到了。
- 服务器可能会有尚未发送完的数据,一旦发送完毕会发送一个finish消息给客户端,告诉客户端不再有数据给你了。
- 客户端收到finish后,此时tcp连接就完全关闭了,客户端会发送给服务器一个ack表示你关闭把。客户端等待2MSL后,自行关闭。
在 Android 中使用 OkHttp 进行网络请求时,当你请求一个 HTTPS 的接口时,SSL/TLS 加密的过程是由 OkHttp 库完成的,而不是手机系统。
下面是 OkHttp 在进行 HTTPS 请求时的大致过程:
- okHttp会进行SSL建立连接,与服务器进行握手。
- okHttp进行的证书验证,根据手机内置的根证书,如果证书验证失败会抛异常。
- okHttp加密通信,将使用SSL/TLS对请求和响应的数据进行加解密。