客户端和服务器如何通过 SSL/TLS 进行加密的详细过程

61 阅读2分钟

握手阶段 (Handshake Phase) :

  1. 客户端发送数据给服务器建立SSL连接:客户端向服务器发送一个支持TLS版本的请求。
  2. 服务器选择加密算法和证书:服务器收到客户端发送过来的请求,把自己的数字证书返回给客户端。数字证书包含公钥和域名等信息,客户端可以用来验证服务器的身份。
  3. 客户端验证服务器的身份:客户端收到服务器发送的数字证书,判断证书是否合法,证书的域名与自己请求地址是否匹配,如果验证通过生成一个随机的对称秘钥,并使用证书的公钥对其加密后,再发给服务器。
  4. 服务器解密客户端发送的随机秘钥:服务器收到客户端加密后数据,使用私钥解开,拿到随机秘钥进行下一步的数据传输。

加密数据传输阶段:

  1. 对称加密通信:一旦客户端和服务器都有了相同的随机秘钥,他们就可以使用对称加密算法来加密和解密通信了。
  2. 数据完整性验证:在加密后,SSL/TLS会使用HMAC算法对数据生成一个摘要(固定长度的秘钥),接收方收到数据后也会使用此算法来生成摘要,如果2个摘要相匹配则说明数据并没有被篡改。

连接终止阶段 (Connection Termination Phase) :

  1. 通信结束后客户端会发送给服务器告诉它,不再发送信息要关闭连接了。
  2. 服务器收到关闭请求,会告诉客户端我收到了。
  3. 服务器可能会有尚未发送完的数据,一旦发送完毕会发送一个finish消息给客户端,告诉客户端不再有数据给你了。
  4. 客户端收到finish后,此时tcp连接就完全关闭了,客户端会发送给服务器一个ack表示你关闭把。客户端等待2MSL后,自行关闭。

在 Android 中使用 OkHttp 进行网络请求时,当你请求一个 HTTPS 的接口时,SSL/TLS 加密的过程是由 OkHttp 库完成的,而不是手机系统。

下面是 OkHttp 在进行 HTTPS 请求时的大致过程:

  1. okHttp会进行SSL建立连接,与服务器进行握手。
  2. okHttp进行的证书验证,根据手机内置的根证书,如果证书验证失败会抛异常。
  3. okHttp加密通信,将使用SSL/TLS对请求和响应的数据进行加解密。