私钥文件(ssl_certificate_key)权限必须设为600且属主为root,存放于/etc/nginx/ssl/等非web可访问路径,禁用密码保护,禁止提交至版本控制,定期审计权限。

私钥文件(ssl_certificate_key)是 HTTPS 通信的命门,一旦泄露,攻击者就能解密流量、伪造服务器身份。操作系统级的文件权限控制,是最直接、最不可绕过的防线。
权限必须设为 600,且属主为 root
私钥文件不能被其他用户读取,哪怕只是“可读”都不行。Nginx 主进程以 root 启动,负责加载私钥;工作进程则降权运行(如 www-data、nginx)。如果私钥权限是 644,普通用户或 PHP 脚本就可能直接读取它。
- 执行 chmod 600 /etc/nginx/ssl/your_domain.key
- 执行 chown root:root /etc/nginx/ssl/your_domain.key
- 绝对避免使用 644、755、666 等开放权限
路径各层目录都要有执行权限(x)
Linux 下访问文件,不仅需要文件本身可读,还要求从根目录到该文件的每一级父目录都至少有执行权限(即能“进入”目录)。常见错误是把私钥放在 /root/ssl/ —— /root 默认 700,root 可进,但 Nginx 启动后子进程切换用户,就卡在进不去。
- 推荐存放路径:/etc/nginx/ssl/ 或 /etc/ssl/private/(这些路径默认权限合理)
- 用 namei -l /etc/nginx/ssl/your_domain.key 检查整条路径每层的权限和属主
- 确保所有上级目录对 root(启动用户)有 r-x 权限,普通用户无权访问
禁止放在 Web 可访问路径下
私钥绝不能出现在 Nginx 的 root、alias 或任何可能被 HTTP 请求命中位置。比如 /var/www/html/ssl/ 或 /usr/share/nginx/html/ 都是高危区域。
- 部署后,在浏览器中尝试访问 https://yoursite.com/ssl/private.key,应返回 403 或 404
- Certbot 等工具默认路径通常安全;手动迁移时务必重新核验路径归属与权限
- 不要将私钥提交到 Git、SVN 等版本控制系统
不启用密码保护,靠权限兜底
虽然可以用 openssl genrsa -aes256 生成带密码的私钥,但 Nginx 不支持启动时交互输密,生产环境必须用无密码私钥 + 严格文件权限组合。
- 生成时若加了密码,需先用 openssl rsa -in encrypted.key -out decrypted.key 去密
- 去密后的文件立即设为 600,并移出临时目录
- 定期审计:用 ls -l /path/to/private.key 确认权限未被意外修改











