在 Nginx 配置 SSL 证书时,必须手动将域名证书与中间证书按照正确顺序拼接成一个完整的 PEM 文件,并让 ssl_certificate 指向该文件。不要依赖系统自动补全证书链,ssl_trusted_certificate 也不能替代这一操作。部署完成后,验证步骤同样非常重要,务必使用 openssl s_client 检查输出结果,确认至少包含两段证书,同时确保 Verify return code 的值不是 20。

补齐中间证书后,服务器会在 TLS 握手阶段一次性向客户端发送完整证书链,SSL 证书链不完整的问题通常就能解决。关键不在于更换证书,而在于保证客户端能够沿着“服务器证书 → 中间 CA → 根 CA”的信任路径顺利完成校验。
怎么看是不是证书链不完整
使用 OpenSSL 一条命令就可以快速判断:
- 执行:
openssl s_client -connect your-domain.com:443 -showcerts - 查看输出中的 Certificate chain 部分:如果只看到 1 张证书(即当前站点的服务器证书),没有第二张(中间 CA)或第三张(根 CA 或其他中间证书),基本就说明 SSL 证书链不完整
- 再看最后一行 Verify return code:如果值为 20,就明确表示 “unable to get local issuer certificate”,也就是客户端无法获取本地颁发者证书,通常就是证书链缺失导致的
Nginx 怎么配才完整
Nginx 不会自动拼接中间证书,因此必须手动合并或正确指定完整链文件:
- 将你的域名证书(
domain.crt)和中间证书(通常命名为ca-bundle.crt,或由证书服务商提供)内容按顺序合并到同一个文件:先放域名证书,换行后再追加中间证书(PEM 格式,内容以-----BEGIN CERTIFICATE-----开头并以对应结尾) - 在 Nginx 配置中,
ssl_certificate必须指向这个合并后的完整证书文件,ssl_certificate_key依然指向私钥文件 - 不要使用
SSLCertificateChainFile(这是 Apache 的配置指令),Nginx 并不支持该写法
用工具自动补链更省事
如果想更高效地修复 SSL 证书链不完整问题,可以借助 cert-chain-resolver 这类工具,它能够根据证书的 AIA 字段自动下载缺失的中间证书:
- 下载后执行:
cert-chain-resolver -o fullchain.pem domain.crt - 工具会自动生成包含服务器证书和所有必需中间证书的
fullchain.pem - 将这个文件直接作为 Nginx 的
ssl_certificate使用,配置更省心,也能减少手动拼接出错的概率
部署后务必验证
修改配置并 reload Nginx 之后,不要只依赖浏览器访问结果,还需要进一步做 SSL 证书链检测:
- 重新执行
openssl s_client命令,确认 Certificate chain 中显示 2–3 张证书,说明服务器已正确下发完整链 - 使用 SSL Labs Server Test 进行扫描,结果中的 “Certificate Chain” 应显示 “OK”,并且评级中不应出现 “Chain issues”
- 通过 Python 的
requests.get("https://your-domain")再做一次连接测试,确认不再出现unable to get local issuer certificate报错
