SSL/TLS 加密
课程(5 节,按顺序学)
第 1 课 · 为什么 HTTP 不够,得加一层 TLS
入门 · 约 8 分钟
本课目标:先搞清楚要解决的三个问题,而不是一上来就背算法名字。
HTTP 明文传输的三个麻烦
普通 HTTP 报文是明文的,路径上任何一个中间设备(公共 WiFi、运营商、任何一跳)都能看到、甚至改掉你的数据。具体拆成三个问题:
· 机密性——内容会被人看到(比如密码、聊天记录)
· 完整性——内容会被人悄悄改掉(比如往下载的文件里插入恶意代码)
· 身份认证——你都不知道对面到底是不是你以为的那个网站(比如公共 WiFi 上有人伪造了一个假的银行页面)
TLS 就是给 HTTP 补上这三样
HTTPS = HTTP + TLS。TLS 插在 HTTP 和 TCP 之间,对上面的应用(浏览器/HTTP)基本透明——应用该怎么用还怎么用,TLS 在下面把机密性(加密)、完整性(防篡改)、身份认证(证书)三件事都做掉了。
实验重点
- HTTP 明文传输有三个问题:会被看、会被改、不知道对面是谁
- TLS = 给 HTTP 补上机密性 + 完整性 + 身份认证
- HTTPS 就是 HTTP 走在 TLS 上面
第 2 课 · 对称加密和非对称加密怎么配合
入门 · 约 10 分钟
本课目标:这是 TLS 整个设计思想的核心,想清楚这一课,后面握手的每一步都好懂。
对称加密:快,但密钥怎么安全交给对方是个难题
对称加密(AES、ChaCha20……)加密和解密用同一把密钥,速度很快,适合加密大量数据。
问题是:这把密钥怎么安全地告诉对方? 如果直接把密钥明文发过去,半路上谁都能截获,加密就白做了。
非对称加密:能解决密钥交换,但慢
非对称加密(RSA、椭圆曲线……)有一对钥匙:公钥可以随便发给任何人,私钥只有自己留着。用公钥加密的内容,只有对应的私钥才能解开。
这解决了「怎么安全交换密钥」的问题——但非对称加密的计算量比对称加密大得多,拿它去加密大量数据(比如整个网页)代价太高。
TLS 的答案:组合起来用
★ 先用非对称加密协商出一个对称密钥,然后全程改用对称加密传数据。
非对称加密只用在握手阶段,只需要交换很小一点信息;一旦对称密钥协商好,后面所有的网页内容都走快得多的对称加密。这就是「又安全又快」的秘密。
实验重点
- 对称加密快,但密钥交换是难题
- 非对称加密能安全交换密钥,但加密大量数据太慢
- TLS 的做法:非对称协商密钥,对称传数据
第 3 课 · 数字证书和 CA 信任链
进阶 · 约 10 分钟
本课目标:公钥谁都能发一个,凭什么相信这个公钥真的是这个网站的?
公钥本身证明不了「它属于谁」
如果服务器直接把公钥发给你,你怎么知道这个公钥不是中间人冒充发的?公钥本身没有身份信息,谁都可以自己生成一对公私钥,自称是任何网站。
数字证书:由第三方(CA)签名担保
数字证书把「域名」和「公钥」绑在一起,再由一个大家都信任的第三方(CA,证书颁发机构)用它自己的私钥签名担保——「我(CA)验证过了,这个公钥真的是这个域名的」。
操作系统和浏览器出厂时预装了一批受信任的根 CA 证书,这是整条信任链的起点。
证书链:从网站证书一路验到根
现网很少直接用根 CA 签发网站证书(根证书的私钥太宝贵,不能随便用),通常是根 CA 签一张中间证书,中间证书再签网站的叶子证书。
浏览器拿到网站证书后,要顺着「叶子 → 中间 → 根」一路验证签名,验到本地预装的根证书才算通过——中间证书没配全,这条链就断了,这是运维最常踩的坑。
实验重点
- 公钥本身证明不了归属,需要 CA 签名担保
- 根 CA 证书预装在操作系统/浏览器里,是信任链的起点
- 证书链要验到根:叶子 → 中间 → 根,缺中间证书链就断了
第 4 课 · TLS 握手到底在协商什么
进阶 · 约 12 分钟
本课目标:对照发包仿真页,把 7 段消息按三个阶段理清楚。
阶段一:密钥协商——一来一回就出结果
客户端在 ClientHello 里就带上了自己的临时公钥(key_share),服务器在 ServerHello 里带上自己的——双方各自用「自己的私钥 + 对方的公钥」算出同一个共享密钥(ECDHE),而这把密钥本身从没有在网络上传输过。
阶段二:身份验证——证书 + 签名,两个都要
服务器发证书链证明「公钥属于我」,再用私钥签名证明「我真的有对应的私钥」——两件事合起来才算验证了身份。客户端本地验证证书链、域名匹配、签名,通过才回一条 Finished。
阶段三:应用数据——改用对称加密
握手一结束,双方就丢开非对称加密,全程改用协商出来的对称密钥加密真正的 HTTP 请求和响应。
实验重点
- 阶段一协商密钥、阶段二验证身份、阶段三才是真正传数据
- 真正的对称密钥从没有在网络上出现过(前向保密)
- 证书证明「谁的公钥」,签名证明「你真有私钥」
第 5 课 · 版本演进:SSL → TLS,1.2 → 1.3
排障 · 约 10 分钟
本课目标:搞清楚这几个版本名字的关系,以及为什么现在都推荐只留 1.2/1.3。
SSL 是 TLS 的前身
SSL 2.0 / 3.0 早就被发现有严重漏洞(3.0 有著名的 POODLE 攻击),已经被禁用。1999 年 IETF 接手改进 SSL 3.0,改名叫 TLS 1.0,此后一路演进到今天的 TLS 1.3。
★ 现在没有一个正经网站真的在用「SSL」协议——「SSL 证书」只是历史习惯延续下来的叫法,背后跑的都是 TLS。
TLS 1.3 相比 1.2:更快、更安全
更快:1.2 握手要 2 个 RTT,1.3 只要 1 个(客户端提前带上 key_share)。
更安全:1.3 直接从协议里删掉了 RSA 密钥交换(没有前向保密)和几种曾出过问题的老加密套件——1.3 的加密套件列表比 1.2 短得多,因为能选的算法本身就少了,全是相对安全的选项。
动手:确认一个站点关掉了老版本
去发包仿真页第 ③ 步,对照着用 openssl s_client -connect 域名:443 -tls1 试一下——配置正确的站点应该直接拒绝连接。
实验重点
- SSL 已经是历史名词,现在跑的都是 TLS
- TLS 1.3 只需要 1 个 RTT,1.2 需要 2 个
- 生产环境应该明确只留 TLS 1.2 / 1.3,关掉更老的版本