证书链与信任验证
客户端验证服务器身份时不只看一张证书,而是验证一条链:服务端下发叶证书与中间证书,客户端用自己的根证书库逐级向上验证,直到找到受信任的根。根证书内置在系统与浏览器里,不需要服务端下发。少发中间证书是「部分设备能打开、部分设备报错」这类问题的经典原因,因为不同客户端的容错能力并不一致。
基本信息
| 叶证书 | 域名证书本身,与服务端私钥配对 |
|---|---|
| 中间证书 | 由 CA 的中间机构签发,必须随链一起下发 |
| 根证书 | 内置在系统或浏览器信任库中,不随服务下发 |
| 下发顺序 | 叶证书在前,中间证书在后;顺序颠倒部分客户端会验证失败 |
| 配置文件 | nginx 的 ssl_certificate 应指向包含叶证书与中间证书的合并文件 |
| 常用验证 | openssl s_client -showcerts 导出链,再用 verify 做链校验 |
验证链完整性
验证链完整性
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null | grep -E 's:|i:' | head -20
# s: 主体信息 i: 签发者信息,用它确认链是否完整
openssl s_client -connect example.com:443 -servername example.com -CAfile /etc/ssl/certs/ca-certificates.crt </dev/null 2>&1 | grep -i 'verify'
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt -untrusted chain.pem leaf.pem # 本地逐级校验
curl -sv https://example.com 2>&1 | grep -i 'certificate' | head常见链问题
| 问题 | 现象 | 处置 |
|---|---|---|
| 缺中间证书 | 桌面浏览器正常,部分手机与命令行工具报错 | 把叶证书与中间证书合并后重新部署 |
| 顺序颠倒 | 少数客户端验证失败,抓包看下发顺序即可确认 | 按叶证书在前、中间证书在后重新排列 |
| 链里夹带根证书 | 部分客户端认为链异常或体积变大 | 去掉根证书,只下发叶证书与中间证书 |
| 证书续期后未同步 | 新证书已生效但链仍是旧的 | 一次性替换完整链文件并重载服务 |
| 双栈走不同配置 | IPv4 正常而 IPv6 报证书错误 | 逐个入口确认是否使用同一份证书文件 |
典型使用场景
- 上线新证书后部分用户报错,判断是否是中间证书缺失
- 排查「命令行正常、手机报错」这类客户端差异问题
- 证书续期时核对部署是否一次替换了整条链
- 排查 CDN 与源站证书不一致导致的验证失败
- 审计信任链长度与是否混入了不该出现的证书
把叶证书与中间证书合并成一个文件后配置给服务端,是避免缺中间证书的标准做法;只配置叶证书在现代客户端上大概率会失败,尤其是移动端。