在重新启动期间,使用https站点将证书密码传递给Nginx

时间:2015-10-12 15:04:14

标签: nginx https openssl ssl-certificate ansible

我通过ansible配置了nginx安装和配置(以及https网站的设置SSL证书)。 SSL证书使用密码短语。

我想编写重启nginx的ansilbe任务。问题如下。

通常情况下,内部有https网站的nginx会在重启期间询问PEM pass phrase。在执行剧本期间,Ansible不会要求该密码短语。

在某些私人目录中有solution存储解密的证书和密钥。但我真的不想把我的证书和密钥留在未加密的地方。

如何在重启期间通过ansible将密码传递给nginx(或openssl)?完美的场景如下:

  1. Ansible要求提供SSL密码(通过vars_promt)。另一种选择是使用ansible vault。
  2. Ansible正在重启nginx,当nginx要求PEM pass phrase时,ansible将密码传递给nginx。
  3. 有可能吗?

2 个答案:

答案 0 :(得分:24)

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可能会失败),但这对我来说似乎是一种合乎逻辑的方法

答案 1 :(得分:4)

如果您对私钥具有足够的权限限制(例如,只让nginx能够读取它),这可能就足够了。无论如何,Nginx必须将它保存在内存中;这对于攻击者来说可能更难恢复,但是如果他们具有对该框的root访问权限,那么无论如何都应该考虑密钥泄露。

或者,您可以将密码传递给正在重新启动的命令(例如echo mypass | service nginx restart)。这将导致它在流程列表上以纯文本显示,不应被视为更安全。

我建议锁定文件的权限,并且没有密码。我不相信Ansible有任何方法可以指定对除sudo之外的个别提示的响应。