本文目录:
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 版本
- 用安全的通道产生并发送临时的随机对称密钥
- 生成随机对称密钥,使用证书中的服务端公钥加密,发送给服务端
- 服务端使用私钥解密获取对称密钥
- 使用对称密钥加密信息,进行交互
简单的过程如下
详细如下
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