Nginx 不支持 ssl_password_file 指令,因其原生设计不提供从文件读取私钥密码的能力;唯一合法做法是预解密私钥并严格控制权限,确保 Nginx 启动时直接使用无密码私钥。
Nginx 不支持ssl_password_file 指令——它在所有最新稳定版本中均不存在。如果你在配置文件中添加该行,Nginx 启动时会直接报错:
unknown directive "ssl_password_file"
这不是配置写法错误、版本过低或模块未加载的问题,而是 Nginx 的原生设计决定:它从不提供从文件自动读取私钥密码的能力。遇到加密私钥时,Nginx 唯一行为是阻塞在终端,等待手动输入 Enter PEM pass phrase:。
所以,“如何配置 ssl_password_file”这个问题本身没有可行答案。真正要做的,是让 Nginx 启动时拿到的是已解密的私钥,而非依赖它去读密码。
在可信构建环境(如 GitHub Actions、GitLab CI)中完成解密,线上机器全程不接触密码或加密私钥:
openssl rsa -in server.key.enc -out server.key -passin file:pwd.txt
chmod 600 server.keychown nginx:nginx server.key
server.key(无密码),删除 pwd.txt 和 server.key.enc,确保它们不进入 Git、不落地生产服务器磁盘。若审计强制要求私钥必须加密,可将密码文件存于 LUKS 加密分区:
/safe/ssl/,存放 passwd.txt
systemd-cryptsetup 配合 TPM2 或内核 keyring 自动解锁RequiresMountsFor=/safe/ssl
600,属主为 nginx,挂载选项含 noexec,nosuid,nodev
适用于容器或云环境,避免磁盘留存:
ssl_password_file 指向内存路径(如 /dev/shm/nginx-pass)chown nginx:nginx /dev/shm/nginx-pass && chmod 600 /dev/shm/nginx-pass
/etc/nginx/ssl/password 并配 ssl_password_file:指令根本无效,且明文落盘风险极高echo "pass" | nginx 或 expect 自动应答:Nginx 不接受 stdin 输入,且进程参数/日志易泄露密码COPY 密码文件再 RUN rm:仍保留在镜像历史层中,可被 docker history 提取运行以下命令:
openssl rsa -noout -text -in /path/to/private.key
Encrypted 或提示 Enter pass phrase for → 需解密Private-Key: 且无报错 → 私钥未加密,无需任何密码机制真正安全又自动的路径,从来不是“让 Nginx 读密码”,而是“不让它看见密码”。