nginx需手动将域名证书与中间证书按序拼接为single pem文件并配置ssl_certificate指向它,不可依赖自动补全或ssl_trusted_certificate;验证须用openssl s_client确认输出含至少两段证书,verify return code非20。

直接补全中间证书,让服务器在 TLS 握手时一次性把整条信任链发给客户端,问题就解了。核心不是换证书,而是确保客户端能顺着“服务器证书 → 中间 CA → 根 CA”这条路径走通。
怎么看是不是证书链不完整
用 OpenSSL 一行命令就能确认:
-
执行:
openssl s_client -connect your-domain.com:443 -showcerts - 看输出里的 Certificate chain 部分:如果只看到 1 张证书(就是你自己的),没出现第二张(中间 CA)、第三张(根 CA 或另一个中间),那就是链断了
- 再看最后一行 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 不认这个指令
用工具自动补链更省事
像 cert-chain-resolver 这类工具能自动从证书的 AIA 字段下载缺失的中间证书:
- 下载后运行:
cert-chain-resolver -o fullchain.pem domain.crt - 它会生成含服务器证书 + 所有必需中间证书的
fullchain.pem - 把这个文件直接用作 Nginx 的
ssl_certificate,一步到位
部署后务必验证
改完配置 reload Nginx 后,不能只靠浏览器测:
- 重跑
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











