在https网站重新启动期间将证书密码传递给Nginx

34

我通过ansible配置了nginx的安装和配置(以及为https网站设置SSL证书)。SSL证书需要密码保护。

我想编写一个ansilbe任务来重启nginx。问题如下:

通常,带有https网站的nginx在重新启动期间会要求输入PEM pass phrase。但是,在执行playbook期间,Ansible不会要求输入该密码。

有一种解决方案是将已解密的证书和密钥存储在某个私有目录中。但我真的不想让我的证书和密钥以未加密的形式留在某处。

如何通过ansible向nginx(或openssl)传递密码以便在重启时使用呢?完美的情况如下:

  1. Ansible通过vars_promt询问SSL密码。另一个选项是使用ansible vault。
  2. 当nginx要求输入PEM pass phrase时,Ansible将密码传递给nginx并重新启动nginx。

这可行吗?

2个回答

62

Nginx有ssl_password_file参数。

指定一个包含密钥口令的文件,每个口令占据一行。在加载密钥时,会依次尝试这些口令。

示例:

http {
    ssl_password_file /etc/keys/global.pass;
    ...
    server {
        server_name www1.example.com;
        ssl_certificate_key /etc/keys/first.key;
    }
    server {
        server_name www2.example.com;
        # named pipe can also be used instead of a file
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}

你可以将 ssl_password_file 保存在 ansible-vault 中,复制它,重新启动 nginx,如果成功,则删除它。我没有第一手经验,不确定它是否有效或者可能会有什么其他副作用(例如手动执行 service nginx restart 可能会失败),但对我来说这似乎是一个合理的方法。

2
将其复制到磁盘上可能会完全打败不将其存储在服务器上的初衷... - Basic
1
你也可以在生成证书时,在openssl命令中加入-nodes来生成不带密码的证书。 - Alcalyn
我认为这不是一个好选择,因为从安全角度来看,密码文件非常危险。 - Jade Han
2
设置密钥密码的目的是为了保护证书在存储(如S3)泄露时不被使用。Ansible从本地ansible-vault等位置获取密码,并仅将证书/密钥组合部署到Web服务器。这限制了攻击因素仅限于已部署的Web服务器。 - Dawid Gosławski

4
如果您对私钥的权限足够限制(例如,只允许nginx能够读取它),这可能已经足够安全了。无论如何,Nginx必须将其加载到内存中;这可能更难被攻击者恢复,但是如果他们拥有root访问权限,则应该认为密钥已经被泄漏。
另一种方法是将密码传递给重新启动命令(例如echo mypass | service nginx restart)。这将导致明文显示在进程列表中,因此不应被认为更加安全。
我建议锁定文件的权限并且不设置密码。我不认为Ansible有任何指定单独提示响应的方法,除非使用sudo。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接