我正在尝试使用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
答案 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)。