nginx ssl证书应存于/etc/nginx/ssl/下按域名建子目录,私钥权限600且属主root,证书用fullchain.pem命名,配置中必须使用绝对路径引用,严禁放于web根目录或可被http访问的路径。

证书目录不能随便建,得兼顾安全、可维护和 Nginx 加载逻辑。核心原则是:路径明确、权限隔离、与 Web 根目录完全分离。
推荐存放位置与目录结构
优先使用系统级统一路径,避免分散在用户目录或临时路径:
- /etc/nginx/ssl/ 是最规范的选择(多数生产环境默认采用)
- 按域名建子目录,例如:
/etc/nginx/ssl/example.com/ - 子目录内只放该域名的证书文件,常见命名:
fullchain.pem(含域名证书+中间 CA)、example.com.key(私钥) - 不建议用
/usr/local/nginx/conf/cert或/home/xxx/cert—— 前者易混入配置文件区,后者属用户可控路径,权限难保障
权限设置必须严格
证书本身虽可公开,但路径失控会引发链路风险;私钥更需严防读取。
- 整个路径链(
/etc/nginx/ssl/ → /etc/nginx/ssl/example.com/)每级目录权限 ≤750,属主root,禁止其他用户写入 - 私钥文件权限必须为
600,且属主root(Nginx 主进程通常以 root 启动,worker 进程降权后仍能读取) - 证书文件(如
fullchain.pem)可设644,但父目录不可 world-readable - 验证命令:
namei -l /etc/nginx/ssl/example.com/fullchain.pem,确认无w权限出现在任意层级
配置中引用要绝对、清晰、可审计
避免相对路径、符号链接或硬编码拼接,降低部署和轮换成本。
- 在
server块中使用绝对路径:ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; - 不要写成
ssl_certificate cert/fullchain.pem;—— 路径含义模糊,依赖当前工作目录,易出错 - 不使用
ln -s指向真实证书 —— 符号链接绕过权限检查,且namei难以追溯实际路径 - 若用 Certbot 等自动化工具,让它直接输出到
/etc/nginx/ssl/对应子目录,保持结构一致
务必避开 Web 可访问路径
哪怕证书内容本身不敏感,暴露路径也会被用于钓鱼分析或配置探测。
- 严禁放在
/var/www/html/、/usr/share/nginx/html/、/opt/app/public/等root或alias指向的目录下 - 手动测试:用
curl https://yoursite.com/fullchain.pem,应返回403或404,绝不能返回证书内容 - 检查 Nginx 配置中是否无意开放了
.pem、.crt后缀的location块











