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 的完整握手流程:

TLS 1.2 握手协议流程图 TLS 1.2 握手协议流程 客户端 (Client) 服务端 (Server) 1. ClientHello 2. ServerHello + 证书 3. 验证证书 4. ClientKeyExchange 5. ChangeCipherSpec 6. 加密通信 6. 加密通信 TLS 1.3 将握手从 2-RTT 优化到 1-RTT,且移除了不安全算法

流程其实不复杂:

  1. ClientHello:客户端告诉服务端,我支持哪些 TLS 版本、加密套件。
  2. ServerHello + 证书:服务端选定版本和套件,同时把自己的证书发过来。
  3. 验证证书:客户端检查证书是否可信、是否过期、域名是否匹配。
  4. 密钥交换:双方协商出一个对称密钥,用于后续加密通信。
  5. ChangeCipherSpec:通知对方,接下来我要用加密通信了。
  6. 加密通信:握手完成,正式数据传输。

我的经验:有一次排查线上问题,发现握手耗时 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 数字签名

这是非对称加密 + 哈希的组合拳。流程是这样的:

  1. 发送方对数据做哈希,得到摘要。
  2. 用私钥加密这个摘要,生成签名。
  3. 接收方用公钥解密签名,拿到摘要。
  4. 接收方自己对数据做哈希,对比两个摘要是否一致。

如果一致,说明数据是发送方签发的,而且没被改过。

注意:我曾经遇到一个案例,有人把自签名证书的私钥泄露到了 GitHub 上。虽然只是测试环境,但攻击者可以用这个私钥伪造身份。记住:私钥永远不要离开你控制的服务器,更不要上传到代码仓库。

1.4 证书链:信任是怎么传递的?

你浏览器里预装了一堆根证书(CA 根证书)。这些根证书的私钥被严密保护着。根证书会签发中间证书,中间证书再签发你的服务器证书。这就形成了证书链。

验证流程:

  • 浏览器拿到你的服务器证书
  • 检查签发者是谁,找到对应的中间证书
  • 再检查中间证书的签发者,直到找到根证书
  • 根证书在浏览器信任列表里,OK,信任成立

避坑指南:部署证书时,一定要把中间证书也带上。我见过太多人只上传了服务器证书,结果 Android 设备访问时报错。正确的做法是把服务器证书和中间证书拼接成一个文件,再配置到 Web 服务器上。

1.5 小结

这一章我们聊了:

  • TLS 是 SSL 的继任者,现在应该用 TLS 1.2 或 1.3
  • 握手协议的核心是身份验证 + 密钥协商
  • 对称加密、非对称加密、哈希、数字签名,四者缺一不可
  • 证书链是信任传递的基石