证书链应精简为域名证书+必要中间证书(不含根证书),按叶到根顺序排列,去重并选最短信任路径;需验证Nginx加载成功且客户端能构建完整信任链并返回Verify return code: 0。

证书链文件本身不参与 Gzip 压缩(因为 TLS 握手阶段传输的是原始二进制数据,不经过 HTTP 压缩),但它的大小直接影响 TLS 握手时 ServerHello 后的 Certificate 消息体积,进而影响首包大小、TTFB 和弱网下的连接成功率。优化核心是:精简、去重、顺序正确、避免冗余中间证书。
只保留必要证书,剔除根证书
证书链文件(如 fullchain.pem)应仅包含:
- 你的域名证书(leaf certificate)
- 所有必需的中间证书(intermediate CA),按从叶到根的顺序排列
绝对不要包含根证书(root CA)——客户端(浏览器/系统)已内置信任根,发送它只会白占 1–2KB;Nginx 会原样转发整个链,多传一个根证书可能让 Certificate 消息突破 1400 字节,触发 IP 分片或延迟确认。
合并重复中间证书,检查链完整性
多个域名共用同一套中间证书时,容易在打包过程中重复写入相同中间证书(例如 Let’s Encrypt 的 R3 被多次追加)。用以下命令检查并去重:
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout
观察输出中是否有重复的 `subject=` 和 `issuer=` 完全一致的证书。若有,手动编辑 fullchain.pem,只保留一份该中间证书,并确保顺序为:
→ 域名证书
→ 中间证书 A
→ 中间证书 B(如有)
→ (不放根证书)
使用最小化链,优先选短链路径
部分 CA 提供多条信任路径(例如 Let’s Encrypt 同时支持 ISRG Root X1 和 DST Root CA X3)。优先选用更短、更现代的链:
- Let’s Encrypt 推荐使用
ISRG Root X1 → R3链(2 个证书),而非旧的DST Root CA X3 → R3 → X1(3 个证书+已过期根) - 可通过
curl -vI https://yourdomain.com查看实际返回的证书数量;也可用 SSL Labs 测试 确认链长度和是否含冗余
验证链文件有效性与兼容性
精简后必须验证两点:
-
服务端能正确加载:运行
nginx -t,确认无SSL_CTX_use_certificate_chain_file() failed类错误 -
客户端能完整构建信任链:用 OpenSSL 模拟握手:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts 2>/dev/null | grep "s:"
输出应显示全部发送的证书(不含根),且末尾有Verify return code: 0 (ok)


















