1. TLS 基础概念:从握手到加密,我们到底在聊什么?
各位同学好,我是老赵。今天咱们开始第一讲。说实话,TLS 这东西我接触了十几年,踩过的坑比写过的代码还多。但别怕,咱们一步步来。
先问个问题:你每天打开浏览器,看到那个小锁图标,真的知道它背后发生了什么吗?嗯,很多人只知道「哦,加密了」,但具体怎么加密、为什么安全,其实一知半解。今天我们就从根上捋一遍。
1.1 TLS/SSL 协议发展史:从 Netscape 到 TLS 1.3
先说说历史。TLS 的前身是 SSL,全称 Secure Sockets Layer。最早是 Netscape 公司在 1995 年搞出来的,目的是让网上购物更安全。那时候我刚入行,还在用 Netscape 浏览器呢。
| 版本 | 发布年份 | 关键变化 | 现状 |
|---|---|---|---|
| SSL 1.0 | 1994 | 从未公开发布,有严重安全缺陷 | 已废弃 |
| SSL 2.0 | 1995 | 首次商用,但存在多个漏洞 | 已废弃 |
| SSL 3.0 | 1996 | 大幅改进,引入证书验证 | 已废弃(POODLE 攻击) |
| TLS 1.0 | 1999 | 基于 SSL 3.0,改名 TLS | 已废弃 |
| TLS 1.1 | 2006 | 防 CBC 攻击改进 | 已废弃 |
| TLS 1.2 | 2008 | 支持 AEAD、SHA-256 | 广泛使用 |
| TLS 1.3 | 2018 | 握手简化、移除不安全算法 | 推荐使用 |
我个人习惯,生产环境只开 TLS 1.2 和 1.3。TLS 1.0 和 1.1 早就该退休了。我记得 2014 年 POODLE 攻击爆发时,我们紧急下线了所有 SSL 3.0 的支持,那叫一个手忙脚乱。
1.2 HTTPS 与 HTTP 的区别:不止多了一个 S
说白了,HTTP 是明文传输,就像你在大街上喊「我的密码是 123456」。HTTPS 呢,就是把这个喊话装进一个加密的信封里。这个「S」就是 TLS/SSL。
但区别远不止加密。我列个表,大家一目了然:
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 数据传输 | 明文,可被窃听 | 加密,防窃听 |
| 默认端口 | 80 | 443 |
| 身份验证 | 无 | 证书验证服务器身份 |
| 数据完整性 | 无校验 | MAC 校验,防篡改 |
| SEO 权重 | 较低 | 更高(Google 偏好) |
| 性能 | 较快 | 略慢(握手开销) |
你想想看,现在哪个正经网站还敢用纯 HTTP?连浏览器都会给你标「不安全」。我在项目中遇到过客户坚持用 HTTP 做内部 API 调用,结果被中间人攻击篡改了数据,损失惨重。从那以后,我要求所有内部通信也必须走 HTTPS。
1.3 TLS 握手协议概述:一次加密的「相亲」过程
TLS 握手,说白了就是客户端和服务器互相认识、交换密钥的过程。我经常把它比作相亲:先打招呼,互相看看证件,商量用什么暗号,最后才进入正题。
下面这张图展示了 TLS 1.2 的完整握手流程。大家仔细看:
握手过程大致分这几步:
- ClientHello:客户端发个招呼,告诉服务器「我支持 TLS 1.2、这些密码套件、这是我的随机数」。
- ServerHello + 证书:服务器回应「我们用 TLS 1.2,这个密码套件,这是我的证书和随机数」。
- 证书验证:客户端检查证书是否可信、域名是否匹配、是否过期。这一步很多人忽略,但恰恰是安全的关键。
- 密钥交换:客户端生成预主密钥,用服务器公钥加密后发过去。双方各自算出主密钥。
- ChangeCipherSpec + Finished:双方确认「从现在开始加密通信」,并验证握手消息没有被篡改。
openssl s_client -connect example.com:443 -tls1_2 来查看握手细节。能看到证书链、密码套件、是否成功。这个命令我几乎每天用。
你可能会问:为什么需要这么多步骤?直接加密不行吗?嗯,这里有个关键问题:对称加密快,但密钥怎么安全地传给对方?非对称加密安全,但慢。所以 TLS 用非对称加密来交换对称密钥,之后用对称加密来传输数据。这叫「混合加密」,既安全又高效。