一、SSL/TLS 基础概念:为什么需要加密通信?

说实话,我刚入行做Android开发那会儿,对加密通信这事也没太当回事。直到有一次,我负责的一个金融类App上线后,被安全团队抓到了明文传输用户密码的问题……嗯,那场面,至今难忘。

今天咱们就来聊聊,为什么你的App需要加密通信,以及SSL和TLS到底是怎么回事。

1.1 为什么需要加密通信?

你想想看,网络通信就像是在明信片上写信。你写的内容,沿途经过的每一个邮局、每一个分拣员,都能看得一清二楚。HTTP协议默认就是这种“明信片”模式。

具体来说,不加密的通信面临三大风险:

  • 窃听风险:中间人可以抓包看到你的全部数据。我在项目中就遇到过,某电商App的搜索关键词被运营商插入了广告。
  • 篡改风险:数据在传输过程中可以被修改。比如你请求的是银行转账页面,中间人给你返回了一个钓鱼页面。
  • 冒充风险:你无法确认你连接的是不是真正的服务器。DNS劫持就是典型的例子。

核心结论:加密通信要解决的就是三个问题——别人看不到、别人改不了、别人装不了。

1.2 SSL 与 TLS 的区别与联系

很多人搞不清SSL和TLS的关系。我简单说:TLS就是SSL的升级版

SSL(Secure Sockets Layer)最早是网景公司搞出来的。1995年出了SSL 2.0,1996年出了SSL 3.0。后来IETF接手了这个标准,给它改了个名叫TLS(Transport Layer Security)。

所以你看版本号就知道了:

协议 发布年份 状态 备注
SSL 2.0 1995 已废弃 存在严重安全漏洞
SSL 3.0 1996 已废弃 POODLE攻击后废弃
TLS 1.0 1999 已废弃 本质是SSL 3.1
TLS 1.1 2006 已废弃 修复了CBC攻击
TLS 1.2 2008 广泛使用 目前主流版本
TLS 1.3 2018 推荐使用 性能和安全大幅提升

避坑指南:我曾经在维护一个老项目时,发现代码里写死了SSLv3。当时我就纳闷,为什么Google Play一直提示安全风险。查了半天才发现,Android 4.4之后已经默认禁用了SSLv3。所以记住:Android开发中永远不要用SSL,直接用TLS

1.3 加密通信的核心流程

说白了,SSL/TLS做的事情就是两件:

  1. 握手阶段:双方协商加密算法、交换密钥、验证身份
  2. 传输阶段:用协商好的密钥加密通信

我画了一张图,帮你理解这个过程:

SSL/TLS 握手流程示意图 客户端 (App) 服务端 ① ClientHello(支持的TLS版本、加密套件) ② ServerHello(选定版本、加密套件)+ 证书 ③ 验证证书 → 生成预主密钥 → 用公钥加密发送 ④ 解密预主密钥 → 生成会话密钥 ⑤ Finished(加密握手消息验证) ⑥ Finished(确认握手完成) 🔒 加密通信开始(使用会话密钥) AES-GCM / ChaCha20 对称加密 客户端→服务端 服务端→客户端

个人经验:我在做Android HTTPS优化时发现,TLS 1.3的握手只需要1个RTT(往返时间),而TLS 1.2需要2个RTT。对于移动端来说,这个差异在弱网环境下特别明显。所以我的建议是:能用TLS 1.3就别用1.2

1.4 Android中的SSL/TLS支持

Android系统对TLS的支持是逐步完善的。我整理了一张表,方便你对照:

Android版本 API级别 默认支持的TLS版本 注意事项
Android 4.x 14-19 TLS 1.0 不支持TLS 1.2,需要额外配置
Android 5.0 21 TLS 1.2 默认启用TLS 1.2
Android 7.0 24 TLS 1.2 开始支持Network Security Config
Android 10+ 29+ TLS 1.3 默认启用TLS 1.3

避坑指南:我曾经在适配Android 4.4设备时踩过坑。那个版本的HttpURLConnection默认只支持TLS 1.0,而服务器端已经禁用了TLS 1.0。结果就是——连接失败。解决方案是手动启用TLS 1.2,或者直接用OkHttp库,它内部做了兼容处理。

1.5 证书验证:信任链是怎么建立的?

你可能会问:我怎么知道服务器给我的证书是真的?

这就涉及到证书链的概念了。简单说:

  • 服务器给你一个证书,上面有它的域名和公钥
  • 这个证书是由某个CA(证书颁发机构)签名的
  • CA的证书又由根CA签名
  • 根CA的证书预置在你的手机里(系统信任列表)

所以验证过程就是:从服务器证书开始,一级一级往上找,直到找到系统信任的根证书。如果中间任何一环对不上,验证就失败。

关键点:Android 7.0之后,App默认只信任系统证书,不信任用户安装的证书。这意味着,即使用户安装了抓包工具的证书,你的App也不会信任它。这其实是好事——防止了中间人攻击。但如果你需要调试,就得在Network Security Config里显式声明。

1.6 小结

好了,这一章的内容就这些。总结几个关键点:

  • 加密通信解决的是窃听、篡改、冒充三大问题
  • TLS是SSL的升级版,开发中直接用TLS
  • 握手阶段的核心是协商密钥和验证身份
  • Android不同版本对TLS的支持不同,建议用OkHttp做兼容
  • 证书验证靠的是信任链,根证书预置在系统中

嗯,这些基础概念搞清楚了,后面咱们才能聊具体的Android实现。下一章我会讲如何在Android代码里配置SSL/TLS,包括自定义TrustManager、HostnameVerifier这些实战内容。


公众号:蓝海资料掘金营,微信deep3321