一、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做的事情就是两件:
- 握手阶段:双方协商加密算法、交换密钥、验证身份
- 传输阶段:用协商好的密钥加密通信
我画了一张图,帮你理解这个过程:
个人经验:我在做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