浅析 OkHttp 的 TLS 连接过程(1) - 基础

本文目录:

1 概述

TLS 是进行 HTTPS 连接的重要环节,通过了 TLS 层进行协商,后续的 HTTP 请求就可以使用协商好的对称密钥进行加密

SSL 是 Netscape 开发的专门用来保护 Web 通讯,目前版本为 3.0。TLS 是 IETF 制定的新协议,建立在 SSL 3.0 之上。所以 TLS 1.0 可以认为是 SSL 3.1

TLS(Transport Layer Security Protocol) 协议分为两部分

  • TLS 记录协议
  • TLS 握手协议

2 基础

2.1 加密

2.1.1 对称密钥加密

编码和解码使用同一个密钥,e = d

加密算法有

  • DES
  • Triple-DES
  • RC2
  • RC4(在 OkHttp 2.3 已经下降支持)

位数越多,枚举攻击花费的时间越长

痛点:发送者和接收者建立对话前,需要一个共享密钥

2.1.2 非对称密钥加密

两个密钥,一个加密,一个解密。私钥持有,公钥公开

  • RSA

破解私钥的难度相当于对极大数进行因式分解

RSA 加密系统中,D 和 E 会相互抵消

E(D(stuff)) = stuff
D(E(stuff)) = stuff

所以具体哪个是私钥,哪个是公钥是由用户选择的

2.2 数字签名

加了密的校验和

  • 证明是原作者,只有原作者可以私钥来进行加密
  • 证明没有篡改,中途篡改校验和就不再匹配

校验和使用摘要算法生成,比如 MD5,SHA

2.3 数字证书

受信任组织担保的用户或公司的信息,没有统一的标准

服务端大部分使用 x509 v3 派生证书,主要信息有

字段 举例
证书序列号 12:34:56:78
证书过期时间 Wed,Sep 17,2017
站点组织名 Lynch
站点DNS主机名 lynch-lee.me
站点公钥 xxxx
证书颁发者 RSA Data Security
数字签名 xxxx

服务端把证书(内含服务端的公钥)发给客户端,客户端使用颁布证书的机构的公钥来解密,检查数字签名,取出公钥。取出服务端的公钥,将后面请求用的对称密钥 X 传递给服务端,后面就用该密钥进行加密传输信息

3 TLS 原理

HTTPS 是在 HTTP 和 TCP 之间加了一层 TLS,这个 TLS 协商了一个对称密钥来进行 HTTP 加密

同时,SSL/TLS 不仅仅可以用在 HTTP,也可以用在 FTP,Telnet 等应用层协议上

SSL/TLS 实际上混合使用了对称和非对称密钥,主要分成这几步

  • 使用非对称密钥建立安全的通道
    • 客户端请求 Https 连接,发送可用的 TLS 版本和可用的密码套件
    • 服务端返回证书,密码套件和 TLS 版本
  • 用安全的通道产生并发送临时的随机对称密钥
    • 生成随机对称密钥,使用证书中的服务端公钥加密,发送给服务端
    • 服务端使用私钥解密获取对称密钥
  • 使用对称密钥加密信息,进行交互

简单的过程如下

TLS 握手

详细如下

SSL Messages

4 主要的类和接口

4.1 JDK

主要由 JDK 的 java.security,javax.net 和 javax.net.ssl 提供的

  • SSLSocketFactory
  • SSLSocket
  • SSLSession
  • TrustManager
    • X509TrustManager
  • Certificate
    • X509Certificate
  • HostNameVerifier

核心类的关系图

4.2 OkHttp

  • RealConnection
  • ConnectionSpecSelector
  • ConnectionSpec
  • CipherSuite
  • CertificatePinner

猜你喜欢

转载自blog.csdn.net/firefile/article/details/80578180