私钥权限必须设为600且属主为root,存放于/etc/nginx/ssl/等非web可访问路径;禁用密码保护,定期审计权限与路径,杜绝git提交及宽松权限(如644、755)。

私钥文件权限和存放位置是 HTTPS 安全的底层防线,Nginx 本身不检查权限,但操作系统会强制执行——权限设错,服务就起不来或直接暴露密钥。
私钥必须设为 600 权限
私钥文件(.key)只能由属主读写,其他用户完全不可访问。这是硬性要求:
- 执行命令:
chmod 600 /etc/nginx/ssl/example.com.key - 禁止使用 644、755、666 等开放权限,否则普通用户或 PHP/CGI 进程可能读取它
- Nginx 主进程以 root 启动,能读取 600 权限的私钥;工作进程不直接读磁盘,而是由主进程加载后传递到内存
存放路径要避开 Web 可访问范围
证书和私钥绝不能放在网站根目录(如 /var/www/html/)或任何 alias 映射路径下,防止被 HTTP 请求意外暴露:
- 推荐路径:
/etc/nginx/ssl/或/etc/ssl/private/(后者需确保目录权限也为 700) - 验证是否安全:在浏览器中访问
https://yoursite.com/ssl/private.key,应返回 403 或 404 - Certbot 默认路径通常合规,但手动迁移后务必复查路径归属与权限
禁止私钥密码保护
虽然 OpenSSL 支持加密私钥,但在生产 Nginx 环境中不实用:
- Nginx 加载带密码的私钥时需交互输入,无法自动重启或热重载
- 真正有效的防护靠系统权限 + 目录隔离 + 审计日志(如 auditd),比密码更可靠
- 仅在离线测试环境可临时加密码,用于防误拷贝
定期审计与最小化暴露面
权限不是一劳永逸,需要持续检查:
- 检查私钥权限:运行
ls -l /etc/nginx/ssl/*.key,确认全是-rw------- - 扫描宽松权限:用
find /etc/nginx -name "*.key" -perm /037 -ls找出风险文件 - 私钥绝不能进 Git/SVN —— 即使私有仓库也不行;CI/CD 中应通过 Vault、AWS Secrets Manager 等注入
- 证书轮换后,旧私钥若需归档,同样按 600 权限加密保存,并严格限制访问人员











