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 的支持,那叫一个手忙脚乱。

⚠️ 避坑指南: 我曾经见过不少企业还在用 TLS 1.0,理由是「兼容老系统」。但你要知道,PCI DSS、NIST 等标准早就禁止了。别为了兼容性牺牲安全性,该升级就升级。

1.2 HTTPS 与 HTTP 的区别:不止多了一个 S

说白了,HTTP 是明文传输,就像你在大街上喊「我的密码是 123456」。HTTPS 呢,就是把这个喊话装进一个加密的信封里。这个「S」就是 TLS/SSL。

但区别远不止加密。我列个表,大家一目了然:

对比项 HTTP HTTPS
数据传输 明文,可被窃听 加密,防窃听
默认端口 80 443
身份验证 无 证书验证服务器身份
数据完整性 无校验 MAC 校验,防篡改
SEO 权重 较低 更高(Google 偏好)
性能 较快 略慢(握手开销)

你想想看,现在哪个正经网站还敢用纯 HTTP?连浏览器都会给你标「不安全」。我在项目中遇到过客户坚持用 HTTP 做内部 API 调用,结果被中间人攻击篡改了数据,损失惨重。从那以后,我要求所有内部通信也必须走 HTTPS。

💡 核心要点: HTTPS 不是「HTTP + 加密」这么简单。它提供了三个安全属性:机密性(加密)、完整性(防篡改)、身份验证(防冒充)。缺一个都不算真正的安全。

1.3 TLS 握手协议概述:一次加密的「相亲」过程

TLS 握手,说白了就是客户端和服务器互相认识、交换密钥的过程。我经常把它比作相亲:先打招呼,互相看看证件,商量用什么暗号,最后才进入正题。

下面这张图展示了 TLS 1.2 的完整握手流程。大家仔细看:

TLS 1.2 完整握手流程 客户端 服务端 ① ClientHello(支持的版本、密码套件、随机数) ② ServerHello + 证书 + ServerKeyExchange ③ ServerHelloDone ④ ClientKeyExchange(预主密钥) ⑤ ChangeCipherSpec + Finished(加密握手消息) ⑥ ChangeCipherSpec + Finished 🔒 加密通信阶段(使用对称密钥) 💡 说明:TLS 1.3 将握手从 2-RTT 优化为 1-RTT,甚至 0-RTT(重连时)。 但核心思想不变:先协商密钥,再加密通信。

握手过程大致分这几步:

  1. ClientHello:客户端发个招呼,告诉服务器「我支持 TLS 1.2、这些密码套件、这是我的随机数」。
  2. ServerHello + 证书:服务器回应「我们用 TLS 1.2,这个密码套件,这是我的证书和随机数」。
  3. 证书验证:客户端检查证书是否可信、域名是否匹配、是否过期。这一步很多人忽略,但恰恰是安全的关键。
  4. 密钥交换:客户端生成预主密钥,用服务器公钥加密后发过去。双方各自算出主密钥。
  5. ChangeCipherSpec + Finished:双方确认「从现在开始加密通信」,并验证握手消息没有被篡改。
🔧 实用技巧: 我在排查 TLS 问题时,常用 openssl s_client -connect example.com:443 -tls1_2 来查看握手细节。能看到证书链、密码套件、是否成功。这个命令我几乎每天用。

你可能会问:为什么需要这么多步骤?直接加密不行吗?嗯,这里有个关键问题:对称加密快,但密钥怎么安全地传给对方?非对称加密安全,但慢。所以 TLS 用非对称加密来交换对称密钥,之后用对称加密来传输数据。这叫「混合加密」,既安全又高效。

⚠️ 避坑指南: 我曾经遇到过一个案例,客户自己生成的证书没有配置完整的证书链,导致某些老旧客户端无法验证。结果就是部分用户死活连不上。记住:证书链必须完整,从服务器证书到根证书,中间证书一个都不能少。