私钥权限控制依赖linux文件权限而非nginx指令,须设为600权限、root属主、存放于web不可达路径(如/etc/nginx/ssl/),并收紧父目录权限,禁用加密私钥和版本控制提交。

私钥权限控制不是靠 Nginx 配置指令实现的,而是操作系统层面的文件权限管理。Nginx 本身不校验或限制谁可以读私钥,它只按配置路径去加载——真正起防护作用的是 Linux 的属主、权限和路径隔离。
私钥文件必须设为 600 权限且属主为 root
私钥一旦被非 root 用户读取,HTTPS 就失去身份可信性。Nginx 主进程以 root 启动来加载私钥,工作进程(如 www-data)不需要也不应直接读磁盘私钥文件。
- 执行 chmod 600 /etc/nginx/ssl/example.com.key —— 确保只有属主可读写,组和其他人完全无权
- 执行 chown root:root /etc/nginx/ssl/example.com.key —— 属主必须是 root,不能是 nginx 或 www-data
- 绝对避免 644、755、666 等宽松权限 —— 这些会让 PHP 脚本、CGI 或普通用户轻易窃取私钥
存放路径必须 Web 不可达且严格隔离
再严的文件权限也挡不住 URL 直接下载。如果私钥放在 Nginx 的 root 或 alias 映射路径下,攻击者可能通过 https://yoursite.com/ssl/private.key 拿走它。
- 推荐路径:/etc/nginx/ssl/ 或 /etc/ssl/private/ —— 默认不在任何 HTTP 映射范围内
- 禁止路径:
/var/www/、/usr/share/nginx/html/、/home/xxx/ssl/等任何被server块中root或location覆盖的位置 - 验证方法:浏览器访问该私钥的 URL,应返回 403 Forbidden 或 404 Not Found,绝不能返回 200 和文件内容
父目录权限也要同步收紧
Linux 访问文件需逐级进入目录,若中间某层目录权限宽松(比如 /root/ssl/),Nginx 工作进程可能因无法“进入”而加载失败,或暴露路径遍历风险。
- 若私钥放在
/etc/ssl/private/,请同步执行:chmod 700 /etc/ssl/private/ 和 chown root:root /etc/ssl/private/ - 用 namei -l /etc/nginx/ssl/example.com.key 检查从
/到私钥文件每一级的权限和属主,确保所有上级目录对 root 有 r-x,对其他人无权访问 - 避免把私钥放在
/root/ssl/——/root默认 700,但 Nginx 子进程切换用户后常卡在此处
其他关键安全约束
权限只是基础,还需配合几个硬性规则才能真正守住私钥命门。
-
私钥不能加密 —— Nginx 启动或 reload 时无法交互输入密码,会导致服务中断;已有加密私钥可用
openssl rsa -in key_encrypted.key -out key_decrypted.key解密 - 不要提交私钥到 Git 或任何版本控制系统 —— 即使是私有仓库,历史记录也难以彻底清理
- Nginx 配置中必须使用绝对路径引用私钥 —— 相对路径或符号链接容易引发权限绕过或加载失败











