核心目标是确保客户端TLS握手时一次性获取完整、顺序正确的证书链,避免因中间证书缺失或顺序错误导致额外延迟;需将终端证书与所有中间证书(不含根证书)按自上而下顺序拼成fullchain.pem,启用OCSP Stapling和会话复用,并精简链长度与算法兼容性。

优化 Nginx 证书链配置,核心目标是让客户端在 TLS 握手阶段一次性、快速、完整地拿到可验证的证书路径,避免因缺失中间证书或顺序错误导致反复请求、校验失败或回退重试——这些都会拖慢握手,尤其在移动端或弱网环境下更明显。
确保完整且顺序正确的证书链文件
客户端验证服务器证书时,需要从服务器证书逐级向上追溯到受信任的根证书。如果 Nginx 只提供终端证书(即域名证书),而没附带中间 CA 证书,客户端就得自己去下载中间证书,这会触发额外 DNS 查询、HTTP 请求和网络等待,延迟可能增加 200ms 以上。
- 把终端证书 + 所有必需的中间证书(不含根证书)按“自上而下”顺序拼成一个 PEM 文件:终端证书在最前,紧接其签发者(一级中间 CA),再下一级中间 CA……直到最靠近根的那个中间证书在最后
- 用
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout验证是否包含全部有效中间证书 - 不要把根证书放进
ssl_certificate文件里——它不在传输链中,加入反而可能引发兼容性问题
启用 OCSP Stapling 加速吊销状态验证
传统方式下,客户端需单独向 CA 的 OCSP 服务器发起查询来确认证书未被吊销;而启用 ssl_stapling 后,Nginx 在握手时主动把已缓存并验证过的 OCSP 响应“装订”进 ServerHello 消息,客户端跳过这一步,通常节省 150–300ms。
- 必须开启:
ssl_stapling on;和严格校验:ssl_stapling_verify on; - 显式配置可靠 DNS 解析器(不能依赖系统默认):
resolver 8.8.8.8 1.1.1.1 valid=300s; - 设置合理超时:
resolver_timeout 5s;,防止 DNS 卡住整个握手 - 确保证书含
OCSP Must-Staple扩展(非必需但推荐),并使用支持该特性的 CA 签发
配合会话复用减少重复链验证开销
即使证书链传得快,每次全新握手仍要走完整证书解析、签名验证、链路构建流程。启用会话复用可跳过大部分耗时环节。
- 开启共享会话缓存:
ssl_session_cache shared:SSL:10m;(10MB 可缓存约 4 万个会话) - 设长有效期:
ssl_session_timeout 4h;或更久(TLS 1.3 下建议 8h,因 1.3 会话票据本身加密更安全) - 对 TLS 1.2+ 客户端,启用会话票据:
ssl_session_tickets on;,并定期轮换密钥:ssl_session_ticket_key /path/to/ticket.key;
精简证书链长度与算法强度平衡
过长的证书链(如嵌套 4 层以上中间 CA)会增大 ServerHello 消息体积,影响首包传输效率,尤其在 TCP 初始拥塞窗口小的场景下易触发重传。
- 优先选用链路短的证书颁发机构(例如 Let’s Encrypt 使用 ISRG Root X1 → R3,仅 1 级中间;而某些商业 CA 可能达 2–3 级)
- 避免混用不同签名算法的证书(如 ECDSA 终端证书 + RSA 中间证书),部分旧客户端可能校验失败或降级处理
- 用
openssl x509 -in cert.pem -text -noout | grep "CA Issuers"检查证书中声明的中间证书地址是否可访问,确保链路可自动补全(作为备用兜底)











