证书链与 PKI:浏览器凭什么信任这个网站
更新时间:2026-09-17。网络协议域·安全。证书在握手中如何被使用见 TLS 握手,吊销查询对性能的影响见 HTTPS 性能。
TLS 解决机密性靠加密,但"我连的服务器是不是真的它"要靠身份认证——这正是证书与 PKI(Public Key Infrastructure,公钥基础设施)的职责。核心机制是一条逐级签名的信任链,终点锚定在客户端系统/浏览器预装的根证书。
一、证书里有什么
一张 X.509 证书主要包含:
- 主体(Subject):证书归属者,以及 SAN(Subject Alternative Name)——该证书对哪些域名/IP 有效(现代校验主要看 SAN,旧的 CN 已不推荐)。
- 公钥:服务器公钥(对应私钥严格保密)。
- 签发者(Issuer):谁签发的(上级 CA)。
- 有效期:Not Before / Not After。
- 数字签名:签发者用其私钥对证书内容的签名。
- 用途约束、扩展(EKU:serverAuth/clientAuth)、CRL/OCSP 地址等。
证书 ≈ { 域名(SAN), 公钥, 有效期, 签发者, CA对以上内容的签名 }二、信任链:根 → 中间 → 服务器
CA 体系是一棵树,信任从上往下传递:
根 CA(Root CA)
├─ 自签名,预置在操作系统/浏览器的"根证书库"里(信任锚)
│
└─ 中间 CA(Intermediate CA,可能多级)
├─ 由上级 CA 签名,根私钥通常离线保管以降低风险
│
└─ 服务器/叶子证书(Leaf,发给 example.com)
└─ 由中间 CA 签名;握手里服务端把"叶子+中间链"一起发给客户端验证过程(以服务器发来的链为输入):
- 用中间 CA 的公钥验证叶子证书的签名是否合法、未被篡改。
- 用根 CA 的公钥验证中间证书的签名。
- 根证书是自签名且已预置在客户端信任库 → 到达信任锚,链成立。
- 再校验:证书在有效期内、SAN 包含访问的域名、用途正确、未被吊销。
任何一环签名对不上、过期、域名不符或被吊销,客户端就报"证书不受信任/连接不安全"。
三、为什么服务器要发"完整证书链"
根证书客户端有,但中间 CA 证书客户端通常没有。如果服务端只发叶子证书、不带中间证书,很多客户端无法从叶子连到信任锚,报 unable to get local issuer certificate(手机/旧浏览器尤其严格)。
- 正确配置:证书文件里叶子在前、中间证书按顺序在后(fullchain),Nginx 的
ssl_certificate应指向 fullchain 而非仅叶子。 - 排查:浏览器小锁查看"证书路径"是否有缺失层级;
openssl s_client -connect host:443 -showcerts看服务端实际发了几张、链是否完整;SSLLabs 会报 chain issues。
四、主机名校验:光有可信 CA 还不够
即使证书由受信 CA 签发,还要确认证书签给了你访问的域名:客户端比对 URL 主机名与证书 SAN(支持通配符如 *.example.com 只匹配一级)。这一步防的是"拿一张合法证书冒充别的站"。绕过校验(如 -k/verify=false)等于关闭身份认证,只应在受控测试临时使用。
五、吊销:CRL 与 OCSP
证书在到期前可能因私钥泄露等需要提前作废:
| 机制 | 做法 | 缺点 |
|---|---|---|
| CRL(吊销列表) | CA 发布一个"已作废序列号"大列表 | 列表越来越大、不实时 |
| OCSP | 客户端实时问 CA:这张证书吊销了吗 | 增加握手时的额外查询、隐私(CA 知道你访问谁)、超时会"软失败"放行 |
| OCSP Stapling(装订) | 由服务器周期性向 CA 取一张带 CA 签名的"证书状态良好"凭证,握手里直接给客户端 | 省掉客户端查询、保护隐私、更可靠;需服务端开启 |
推荐开启 OCSP Stapling,兼顾吊销校验与性能(见 HTTPS 性能)。
六、自签名证书与常见报错
- 自签名:证书不是由受信 CA 签的(常见于内网/测试)。客户端默认不信任;内网可选择把该 CA 显式导入信任库,而不是全局关闭校验。
- 证书过期:Not After 到期,自动化续期(ACME/Let's Encrypt 90 天 + 自动续期)是标准做法,监控到期时间很重要。
- 域名不匹配:证书 SAN 没有该主机名(如用 IP 访问、CDN 回源)。
- 链不完整:缺中间证书(见第三节)。
- 名称/协议风险:SHA1、密钥太短、TLS 版本过旧。
相关阅读
证书在握手中的使用见 TLS 握手,1.3 精简流程见 TLS 1.3,OCSP/链对 RTT 的影响见 HTTPS 性能与会话复用。
总结
PKI 用"根 CA→中间 CA→叶子证书"的逐级数字签名建立信任链:客户端只信任预装的根,用上级公钥逐级验签直到信任锚,并额外校验有效期、SAN 主机名与吊销状态;服务端必须下发叶子+中间的完整链、推荐 OCSP Stapling 提供吊销状态;自签名、过期、域名不符或缺中间证书是绝大多数证书报错的原因。