在Ansible中生成证书链

时间:2018-07-16 20:21:50

标签: 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

1 个答案:

答案 0 :(得分:2)

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

如果使用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(并且仅凭密钥就无法知道在签名任务过程中密钥是谁的-密钥只是一个随机数;您需要提供密钥的证书在任务中的某个地方签署聚会,而您不是)。


this commit引入的新提供者ownca的帮助下,Ansible 2.7可能实现您想要实现的目标:

  

“ 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(请参阅examples)。