1. TLS/SSL 基础概念:从握手到加密,一次讲透
各位好,我是老周。今天咱们开始聊 TLS 证书管理。第一节课,我先把地基打牢——TLS/SSL 到底是什么,它怎么工作的,背后用了哪些密码学工具。
说实话,我见过不少运维同学,证书到期了就去续,续完了就忘,直到线上报错才慌慌张张去查。嗯,这其实挺危险的。你想想看,如果连 TLS 的基本原理都不清楚,出了问题你连日志都看不懂。
1.1 什么是 TLS?它和 SSL 是什么关系?
TLS(Transport Layer Security),翻译过来叫「传输层安全协议」。它的工作位置在 TCP 之上、应用层之下。说白了,就是在你浏览器和服务器之间,加了一层加密隧道。
那 SSL 呢?SSL 是 TLS 的前身。我来给你捋一下历史:
| 版本 | 发布年份 | 状态 | 说明 |
|---|---|---|---|
| SSL 1.0 | 1994 | 从未公开发布 | Netscape 内部版本,有严重安全缺陷 |
| SSL 2.0 | 1995 | 已废弃(2011) | 第一个公开版本,但漏洞太多 |
| SSL 3.0 | 1996 | 已废弃(2015) | POODLE 攻击后彻底退役 |
| TLS 1.0 | 1999 | 已废弃(2021) | 基于 SSL 3.0 改进,改名 TLS |
| TLS 1.1 | 2006 | 已废弃(2021) | 修复 CBC 攻击 |
| TLS 1.2 | 2008 | 广泛使用 | 当前主力版本,支持 AEAD |
| TLS 1.3 | 2018 | 推荐使用 | 握手只需 1-RTT,移除不安全算法 |
核心结论:现在你听到有人说「SSL 证书」,其实指的就是 TLS 证书。SSL 这个叫法已经过时了,但大家叫顺口了改不过来。我个人习惯在文档里统一写「TLS 证书」,避免混淆。
1.2 TLS 握手协议概述
握手是 TLS 最核心的部分。我当年第一次抓包看 TLS 握手,说实话,被那一堆 ClientHello、ServerHello 搞得头晕。后来我画了一张图,一下就清楚了。
下面这张 SVG 图,展示的是 TLS 1.2 的完整握手流程:
流程其实不复杂:
- ClientHello:客户端告诉服务端,我支持哪些 TLS 版本、加密套件。
- ServerHello + 证书:服务端选定版本和套件,同时把自己的证书发过来。
- 验证证书:客户端检查证书是否可信、是否过期、域名是否匹配。
- 密钥交换:双方协商出一个对称密钥,用于后续加密通信。
- ChangeCipherSpec:通知对方,接下来我要用加密通信了。
- 加密通信:握手完成,正式数据传输。
我的经验:有一次排查线上问题,发现握手耗时 2 秒多。抓包一看,原来是证书链没配完整,客户端在下载中间证书。从那以后,我每次部署都会用 openssl s_client -connect 检查证书链是否完整。
1.3 密码学基础:四把钥匙打开 TLS 的大门
要理解 TLS,你得先懂四个密码学概念。我不讲太深,够用就行。
1.3.1 对称加密
加密和解密用同一个密钥。速度快,适合加密大量数据。TLS 握手完成后,真正的数据传输用的就是对称加密。
常见算法:AES、ChaCha20。
关键点:对称加密的问题是——密钥怎么安全地传给对方?这就引出了非对称加密。
1.3.2 非对称加密
有一对密钥:公钥和私钥。公钥加密的数据只能用私钥解密,反过来也一样。速度慢,但解决了密钥分发问题。
常见算法:RSA、ECDSA。
在 TLS 握手中,非对称加密只用来做两件事:
- 验证身份(数字签名)
- 安全地交换对称密钥
1.3.3 哈希函数
把任意长度的数据,压缩成固定长度的「指纹」。不可逆,而且输入稍微一变,输出就天差地别。
常见算法:SHA-256、SHA-384。
哈希在 TLS 里用来做消息完整性校验——确保数据在传输过程中没被篡改。
1.3.4 数字签名
这是非对称加密 + 哈希的组合拳。流程是这样的:
- 发送方对数据做哈希,得到摘要。
- 用私钥加密这个摘要,生成签名。
- 接收方用公钥解密签名,拿到摘要。
- 接收方自己对数据做哈希,对比两个摘要是否一致。
如果一致,说明数据是发送方签发的,而且没被改过。
注意:我曾经遇到一个案例,有人把自签名证书的私钥泄露到了 GitHub 上。虽然只是测试环境,但攻击者可以用这个私钥伪造身份。记住:私钥永远不要离开你控制的服务器,更不要上传到代码仓库。
1.4 证书链:信任是怎么传递的?
你浏览器里预装了一堆根证书(CA 根证书)。这些根证书的私钥被严密保护着。根证书会签发中间证书,中间证书再签发你的服务器证书。这就形成了证书链。
验证流程:
- 浏览器拿到你的服务器证书
- 检查签发者是谁,找到对应的中间证书
- 再检查中间证书的签发者,直到找到根证书
- 根证书在浏览器信任列表里,OK,信任成立
避坑指南:部署证书时,一定要把中间证书也带上。我见过太多人只上传了服务器证书,结果 Android 设备访问时报错。正确的做法是把服务器证书和中间证书拼接成一个文件,再配置到 Web 服务器上。
1.5 小结
这一章我们聊了:
- TLS 是 SSL 的继任者,现在应该用 TLS 1.2 或 1.3
- 握手协议的核心是身份验证 + 密钥协商
- 对称加密、非对称加密、哈希、数字签名,四者缺一不可
- 证书链是信任传递的基石