首页 > 解决方案 > 在 Ansible 中生成证书链

问题描述

我正在尝试使用 Ansible OpenSSL 模块生成证书链(自签名 + 一个由自签名的证书)。

到目前为止有以下任务:

- name: Generate a Self Signed OpenSSL certificate
  become: yes
  block:
    - apt: 
        name: python-openssl
        update_cache: yes
    - openssl_privatekey:
        path: /tmp/ansible.com.pem
    - openssl_csr:
        path: /tmp/ansible.com.csr
        privatekey_path: /tmp/ansible.com.pem
        common_name: ansible.com
    - openssl_certificate:
        path: /tmp/ansible.com.crt
        privatekey_path: /tmp/ansible.com.pem
        csr_path: /tmp/ansible.com.csr
        provider: selfsigned
    - openssl_privatekey:
        path: /tmp/child.com.pem
    - openssl_csr:
        path: /tmp/child.com.csr
        privatekey_path: /tmp/child.com.pem
        common_name: child.com
    - openssl_certificate:
        path: /tmp/child.com.crt
        privatekey_path: /tmp/ansible.com.pem
        csr_path: /tmp/child.com.csr
        provider: selfsigned

但问题是子证书无效:

openssl verify -verbose -CAfile /tmp/ansible.com.crt /tmp/child.com.crt
/tmp/child.com.crt: CN = child.com
error 18 at 0 depth lookup:self signed certificate
OK

我正在使用 Ansible 2.6.1

标签: ansible

解决方案


自签名证书是自签名证书,无论您为签名提供了什么密钥(无论如何,此密钥永远不会被验证,因为“您直接信任证书”)。

如果您child.com.crt使用命令检查证书的内容openssl x509 -in /tmp/child.com.crt -text -noout,您将看到:

Certificate:
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=child.com
        Subject: CN=child.com

不是Issuer: CN=ansible.com(并且在签名任务期间没有办法知道它是谁的密钥,仅基于密钥 - 密钥只是一个随机数;您需要在任务中的某处提供签名方的证书,这你没有)。


在 Ansible 2.7 中,您想要实现的目标将通过此提交ownca引入的新提供程序实现:

'ownca' 提供程序旨在生成使用您自己的 CA(证书颁发机构)证书(自签名证书)签名的 OpenSSL 证书。

[ ]

例子:

- name: Generate an OpenSSL certificate signed with your own CA certificate
  openssl_certificate:
    path: /etc/ssl/crt/ansible.com.crt
    csr_path: /etc/ssl/csr/ansible.com.csr
    ownca_path: /etc/ssl/crt/ansible_CA.crt
    ownca_privatekey_path: /etc/ssl/private/ansible_CA.pem
    provider: ownca

现在(直到 Ansible 2.6.x)您需要使用该模块调用openssl x509 -req(参见示例) 。command


推荐阅读