相信大家在学习计算机网络的过程中都会接触到 HTTP 和 HTTPS,TLS四次握手的环节也被频繁地提及。但大部分文章对第三次握手:客户端验证服务器提供的证书并提取公钥只是一笔带过,但实际上验证服务器证书是否合法也是很复杂的,其中就要经过 TLS 版本链的验证。这篇文章就要详细解析这个问题。
数字证书与CA
CA = Certificate Authority,证书颁发机构
它是受信任的第三方机构,负责:
- 验证网站 / 机构 / 个人的真实身份
- 用自己的私钥签发数字证书
- 维护证书的合法性、有效期、吊销状态
数字证书 = 身份证(网络世界的)
一份标准证书里主要包含:
- 持有者公钥
- 持有者域名 / 组织 / 个人信息
- 有效期
- 签发它的 CA 信息
- CA 用私钥做的数字签名(保证没被篡改)
一句话:数字证书 = 公钥 + 身份信息 + CA 的签名
证书链
信任链是根证书 → 中间证书 → 终端证书的层级结构,每一层都由上一层用私钥签名,形成可追溯的信任传递。
| 层级 | 名称 | 角色与作用 | 存储位置 | 签发方式 |
|---|---|---|---|---|
| 顶端 | 根证书(Root CA) | 信任锚点,整个体系的权威起点;私钥离线、严格保密 | 操作系统 / 浏览器内置信任库(如 Windows "受信任的根证书颁发机构") | 自签名(自己签发自己) |
| 中间 | 中间证书(Intermediate CA) | 根 CA 的授权代理,用于签发终端证书;隔离根 CA 私钥,降低泄露风险 | 服务器需随终端证书一起发送给客户端 | 由根证书私钥签名签发 |
| 底端 | 终端证书(End-Entity/Server Cert) | 直接绑定域名 / 服务器,用于 TLS 握手的身份认证与密钥交换 | 部署在 Web 服务器(Nginx/Apache 等) | 由中间证书私钥签名签发 |
流程
- 获取证书链 :服务器在 TLS 握手时,返回终端证书 + 所有中间证书(必须完整,否则客户端无法构建到根的路径)。
- 逐级验证签名
- 用中间证书公钥 验证终端证书的签名 → 确认终端证书由该中间 CA 合法签发。
- 用根证书公钥 (来自本地信任库)验证中间证书的签名 → 确认中间 CA 由受信任根 CA 授权。
- 信任锚定 :验证追溯到本地预装的根证书 → 信任链成立。
- 附加有效性检查
- 证书未过期(检查 Not Before/Not After)。
- 域名匹配(CN/SAN 与访问域名一致)。
- 未被吊销(查询 CRL/OCSP)。
- 签名算法安全(如禁用 SHA-1)。
- 结果:全部通过 → 连接安全(浏览器显示锁);任一失败则报错

额外疑问
为什么会提示 "证书不受信任"?
- 证书是自签名的
- 证书由不知名 / 未预装的 CA 签发
- 证书链不完整(缺中间证书)
自签名证书和 CA 证书区别?
- 自签名:自己签自己,浏览器不认
- CA 证书 :由权威机构签发,系统 / 浏览器内置信任
CA 为什么安全?
- 根 CA 私钥离线保存、极度安全
- 中间 CA 用来实际签发,隔离风险
- 浏览器 / OS 只信任极少数根 CA