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

pet*_*hka 19 https openssl nginx ssl-certificate ansible

https通过ansible配置了nginx安装和配置(以及为站点设置SSL证书).SSL证书使用密码短语.

我想写一个重启nginx的ansilbe任务.问题是如下.

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

解决方案将解密的证书和密钥存储在某个私人目录中.但我真的不想把我的证书和密钥留在未加密的地方.

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

  1. Ansible要求提供SSL密码(通过vars_promt).另一种选择是使用安全保险库.
  2. Ansible正在重启nginx,当nginx要求时PEM pass phrase,ansible将密码传递给nginx.

可能吗?

Mxx*_*Mxx 29

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以做的是将它保存ssl_password_file在ansible-vault中,复制它,重新启动nginx然后如果成功删除它.

我没有第一手经验,如果它实际上有效或者其他可能产生的副作用(例如手册service nginx restart可能会失败),但对我来说这似乎是一种合乎逻辑的方法.

  • 将其复制到磁盘可能会破坏不将其存储在服务器上的全部意义...... (2认同)
  • 在密钥上设置密码的目的是防止证书从存储(如 S3)泄漏时被使用。Ansible 从本地 ansible-vault 等地方知道密码,并仅将证书/密钥组合部署到网络服务器。这将攻击因素限制为仅部署的 Web 服务器。 (2认同)