核心是将域名证书与中间证书按顺序合并为单个pem文件作为ssl_certificate值:先域名证书、再中间证书,无空行、不包含根证书;nginx中仅保留该合并文件路径与独立私钥配置,重载后用openssl验证输出至少两行subject确认链完整。

核心就一点:把你的域名证书(主证书)和中间证书按顺序拼成一个 PEM 文件,作为 ssl_certificate 的值,中间不能夹根证书、不能有空行、顺序不能颠倒。
确认哪些证书需要合并
你手头通常有三类文件:
-
域名证书(如
example.com.crt或server.crt)——这是 CA 给你签发的、带 CN=your-domain.com 的那张证书 -
中间证书(如
intermediate.crt、ca-bundle.crt或 Let’s Encrypt 的chain.pem)——CA 提供的信任桥梁,常见名称含 “R3”“G2”“Secure Server CA” 等 -
根证书(如
root.crt)——浏览器/系统已内置,不要放进合并文件
严格按顺序拼接 fullchain.pem
打开终端,执行:
cat example.com.crt intermediate.crt > fullchain.pem
注意:
- 第一段必须是你的域名证书(
BEGIN CERTIFICATE开头,含你的域名) - 紧接着是中间证书(可能一段或多段,按信任路径从近到远排列)
- 两段之间不能有空行,结尾不能有多余空格或换行
- 用
grep -c "BEGIN CERTIFICATE" fullchain.pem检查,结果应为 2 或更多
Nginx 配置中只改这一处
在 server 块里,确保只有这一行生效:
ssl_certificate /path/to/fullchain.pem;
同时保留原有私钥配置:
ssl_certificate_key /path/to/example.com.key;
删掉或注释掉旧的 ssl_certificate /xxx/your-domain.crt; 行。重载配置:nginx -t && systemctl reload nginx
验证是否真正生效
别信浏览器缓存,用命令实测:
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | grep "subject="
输出中应看到至少两行:
- 一行含
CN=example.com - 另一行含中间 CA 名称,如
CN=Let's Encrypt R3或CN=DigiCert SHA2 Secure Server CA











