SSL证书须统一存放于/etc/nginx/ssl/,按域名建独立子目录,私钥权限设为600且属主为root,证书链须合并为fullchain.pem并含域名证书与中间证书,配置中必须使用绝对路径引用。

SSL 证书文件在 Nginx 目录结构中必须严格隔离、权限可控、路径明确,不能图省事放错位置或混进配置里。
统一存放于专用安全目录
推荐固定使用 /etc/nginx/ssl/ 作为根证书目录,所有证书相关文件都集中在此,不分散到 /tmp、网站根目录或用户家目录等易暴露位置。
- 每个域名建独立子目录,例如:
/etc/nginx/ssl/example.com/ - 子目录内只放该域名必需的文件:完整证书链(
fullchain.pem)、私钥(privkey.key) - 避免使用通配符或模糊命名(如
cert.crt),应带域名前缀便于识别和更新
私钥文件权限与属主必须严格控制
私钥是最高敏感资产,一旦泄露等于交出服务器身份控制权。
- 执行
sudo chmod 600 /etc/nginx/ssl/example.com/privkey.key - 确保属主为
root(Nginx 主进程以 root 启动,worker 进程可读取该文件) - 输出
ls -l应显示-rw-------,组和其他用户无任何权限 - 若 Nginx 以非 root 用户运行(如
www-data),用setfacl授予最小读取权限,不改属主或放宽 chmod
证书链必须合并为单一 PEM 文件
Nginx 的 ssl_certificate 指令只接受一个 PEM 文件,且必须包含完整信任链。
- 顺序必须是:域名证书 + 所有中间证书(根证书不放入)
- 命令示例:
cat example.com.crt intermediate.crt > /etc/nginx/ssl/example.com/fullchain.pem - 验证方式:
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout,应输出至少两段证书 - 切勿直接使用原始
cert.pem或仅域名证书——缺少中间证书会导致部分客户端报“不安全”警告
配置中必须用绝对路径引用,禁止硬编码或符号链接
路径写死、可读、可审计,不依赖相对路径或软链,避免因路径解析异常导致加载失败或越权访问。
- 配置中写成:
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/example.com/privkey.key;- 不要用
../、~或/var/www/ssl/这类易被 Web 访问到的路径 - 不建议把证书内容直接写进
nginx.conf或站点配置中(硬编码风险高,更新困难)


















