生产环境nginx ssl证书链配置核心是确保完整可信与全客户端兼容,必须使用fullchain.pem(含域名证书+中间证书),禁用仅含域名证书的cert.pem;私钥权限须为600且属主匹配nginx运行用户;配置中ssl_certificate与ssl_certificate_key须严格配对并指向正确绝对路径。

生产环境 Nginx 的 SSL 证书链配置,核心不是“能不能用”,而是“是否完整可信、是否兼容所有客户端”。很多红锁、App 报错、iOS 信任失败,问题不在 nginx.conf 写错,而在于证书链缺失、路径混乱或权限失控。
证书文件必须是完整链(fullchain),不能只放域名证书
常见错误:把 cert.pem(仅含域名证书)当完整证书用,漏掉中间 CA 证书。浏览器会因无法构建信任链而报“不安全”。
- 正确做法:使用 fullchain.pem(或命名如
example.com.pem),它应包含三部分顺序拼接:
— 域名证书(your_domain.crt)
— 中间证书(intermediate.crt)
— (可选)根证书(一般不放,现代系统已内置) - 验证方式:
openssl x509 -in fullchain.pem -text -noout | grep "Issuer\|Subject",确认中间证书的 Issuer 与上一级的 Subject 能逐级匹配 - 云厂商下载的 Nginx 包中,通常已提供
fullchain.pem或xxx_bundle.crt,直接用即可,勿手动拆分
私钥权限必须严格限制为 600,且属主为 nginx 运行用户
私钥泄露等于证书失效。Nginx 启动时若读取失败,会静默降级为 HTTP 或直接启动报错。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 执行:
chmod 600 /etc/nginx/ssl/example.com.key - 确认属主:
chown nginx:nginx /etc/nginx/ssl/example.com.key(Ubuntu/Debian 下可能是www-data:www-data) - 禁止将私钥放在 web 可访问目录(如
/usr/share/nginx/html),也禁用 world-readable 权限(如 644)
配置中必须显式指定证书链路径,且与私钥配对使用
Nginx 不会自动补全中间证书;ssl_certificate 必须指向 fullchain 文件,ssl_certificate_key 指向私钥 —— 二者缺一不可,且必须一一对应。
- 示例配置片段:
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 其他 TLS 参数略
}
- 切勿混用不同域名的 key 与 pem;通配符证书(
*.example.com)也需确保server_name在其 SAN 列表中(含裸域名需额外添加) - 多个子域共用同一证书时,所有
server块必须引用完全相同的ssl_certificate和ssl_certificate_key路径
上线前必做三项验证动作
配置 reload 前不验证,等于把风险直接推给终端用户。
-
语法检查:
nginx -t确保无配置错误 -
链路实测:
curl -I --insecure https://example.com看是否返回 200;再用openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text查看证书链是否完整输出 - 客户端覆盖测试:至少在 Chrome、Safari、Android WebView、iOS App(如有)中打开,确认无证书警告;特别注意企业内网设备或老旧 Android 版本,它们对中间证书更敏感










