私钥安全取决于操作系统属主和权限:必须root属主、600权限、存于web不可达路径(如/etc/nginx/ssl/)、父目录设700且root属主,禁用密码保护及宽松权限。

私钥文件的安全不靠 Nginx 配置指令控制,而取决于操作系统层面的属主和权限设置。只要这两项没设对,哪怕配置完全正确,HTTPS 也等于裸奔。
必须设为 root 属主
Nginx 主进程以 root 身份启动,才能读取私钥;工作进程(如 www-data 或 nginx 用户)本就不该、也不需要直接访问磁盘上的 .key 文件。所以私钥文件必须明确归属 root:
- 执行 chown root:root /etc/nginx/ssl/example.com.key
- 不能设成 nginx、www-data 或其他普通用户,否则主进程可能因权限不足无法加载
- 尤其注意:不要用 umask 002 创建私钥,否则默认会带 group 可读(如 640),属于高危状态
权限必须是 600
600 表示仅属主可读写,组和其他用户完全无权访问。这是硬性底线:
- 执行 chmod 600 /etc/nginx/ssl/example.com.key
- 绝对禁止 644、755、666 等宽松权限——PHP 脚本、CGI 或任意普通用户都可能读取并泄露私钥
- 如果使用 OpenSSL 生成私钥时加了 -des3 参数,会要求输入密码,这反而会导致 Nginx 启动失败(需手动输密),所以生产环境务必禁用密码保护
存放路径要确保 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 或 404,绝不能返回 200 + 文件内容
父目录权限也要收紧
即使私钥文件本身是 600,若其所在目录权限太松(比如 755),攻击者仍可能列出目录内容或尝试路径遍历:
- 执行 chmod 700 /etc/nginx/ssl/,确保只有 root 可进入和读取该目录
- 同时确认 chown root:root /etc/nginx/ssl/,避免目录属主非 root
- 不建议把私钥和证书混放在开放目录(如 /etc/ssl/certs/),那里通常权限较宽,专用于公钥分发











