Ansible: 创建自签名SSL证书和密钥

14

我希望创建一个自签名证书,以便在redis服务器和客户端之间安全地隧道化我的redis流量时与stunnel一起使用。我正在使用此命令生成证书,并且它可以正常工作。

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/stunnel/redis-server.key -out /etc/stunnel/redis-server.crt

由于我正在使用Ansible进行配置,我想知道如何将此转换为更符合Ansible模块的方式。 实际上,有一个名为openssl_certificate的Ansible模块,它声明了"此模块允许重新生成OpenSSL证书。" 我尝试使用该模块生成证书,但无法使其正常工作。

- name: Generate a Self Signed OpenSSL certificate
  openssl_certificate:
    path: /etc/stunnel/redis-server.crt
    privatekey_path: /etc/stunnel/redis-server.key
    csr_path: /etc/stunnel/redis-server.csr
    provider: selfsigned

从文档来看,我无法指定以下参数-x509 -nodes -days 3650 -newkey rsa:2048。当然,我也可以拆分密钥和证书生成,但这仍然无法让我使用Ansible模块,正确吗?

示例:

openssl genrsa -out /etc/stunnel/key.pem 4096

openssl req -new -x509 -key /etc/stunnel/key.pem -out /etc/stunnel/cert.pem -days 1826

我想了解以下事情:

  • a) 如何使用Ansible模块获得与原始命令相同的结果?
  • b) 是否有更好的方法使用Ansible管理自签名证书?

3
需要进行以下步骤:1)生成私钥 2)使用私钥来生成证书签名请求(CSR) 3)使用私钥和CSR来生成自签名证书 - Vladimir Botka
4
例如,查看 cert-self-signed.yml - Vladimir Botka
谢谢!- 这正是我在寻找的! - Tom
3个回答

24
- openssl_privatekey:
    path: /etc/stunnel/redis-server.key
    size: 2048 

- openssl_csr:
    path: /etc/stunnel/redis-server.csr
    privatekey_path: /etc/stunnel/redis-server.key

- openssl_certificate:
    provider: selfsigned
    path: /etc/stunnel/redis-server.crt
    privatekey_path: /etc/stunnel/redis-server.key
    csr_path:/etc/stunnel/redis-server.csr
  • "-newkey rsa:2048" 处理的是 privatekey 中的“size”
  • "-x509" 默认设置
  • 我找不到 "-nodes" 和 "-days 3650"

哦,我想你是对的,但我从未在生产中使用过这个解决方案... 如果答案获得了5个赞或有人发表评论,我会接受这个答案。 - Tom
7
否则,openssl_certificate需要一个 provider: selfsigned。除此之外这个对我来说是有效的。我想可以使用 selfsigned_not_after 来实现 -days - nondeterministic

7
您可以通过以下两个步骤实现此目标(在 Ansible 5.7.1 中测试通过):
- name: Ensure private key is present
  community.crypto.openssl_privatekey:
    path: /etc/stunnel/redis-server.key
    size: 2048
    mode: 0600
    type: RSA
    
- name: Ensure self-signed cert is present
  community.crypto.x509_certificate:
    path: /etc/stunnel/redis-server.crt
    privatekey_path: /etc/stunnel/redis-server.key
    provider: selfsigned
    selfsigned_not_after: "+3650d" # this is the default
    mode: 0644

如果您在生成私钥的任务中未设置密码短语,则默认情况下它将不含密码。

如@nondeterministic之前提到的,您可以通过selfsigned_not_after设置有效期。

mode参数设置密钥和证书文件的文件权限。尽可能设置权限是一种常见的最佳实践,并且默认情况下也会被ansible-lint检查。

来源:


2
对于其他人和我未来的自己,这是一个扩展示例,使用CRT来设置自签名证书的主题和组织名称。
    - name: Generate a self-signed private key
      community.crypto.openssl_privatekey:
        path: "{{ nginx_ssl_certificate_key }}"
        size: 4096
        mode: 0600
        type: RSA
        state: present

    - name: Create certificate signing request (CSR) for self-signed certificate
      community.crypto.openssl_csr_pipe:
        privatekey_path: "{{ nginx_ssl_certificate_key }}"
        common_name: "{{ cert_common_name }}"
        organization_name: "{{ cert_organization_name }}"
      register: csr

    - name: Generate a self-signed SSL/TLS certificate (valid for 10 years)
      community.crypto.x509_certificate:
        path: "{{ nginx_ssl_certificate }}"
        privatekey_path: "{{ nginx_ssl_certificate_key }}"
        csr_content: "{{ csr.csr }}"
        provider: selfsigned
        selfsigned_not_after: "+3650d"
        mode: 0644

希望这对其他人有所帮助。

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