【问题标题】:Create a cert with multiple subject alt names with Ansible使用 Ansible 创建具有多个主题替代名称的证书
【发布时间】:2017-11-14 10:25:16
【问题描述】:

我正在使用如下块

- name: Ensure that the existing certificate has a certain domain in its subjectAltName
  openssl_certificate:
    path: /etc/ssl/crt/example.com.crt
    provider: selfsigned
    subject_alt_name:
      - www.example.com
      - test.example.com

要使用 Ansible 生成自签名证书,我想将库存文件中的 ips 用作 subject_alt_names 之类的东西

- name: Generate cert
  openssl_certificate:
    path: ssl/mongo-test.crt
    privatekey_path: ssl/mongo-test.pem
    csr_path: ssl/mongo-test.csr
    provider: selfsigned
    subject_alt_name: 
      - IP:{{hostvars[item].ansible_host}}

这样我就结束了

- name: Generate cert
  openssl_certificate:
    path: ssl/mongo-test.crt
    privatekey_path: ssl/mongo-test.pem
    csr_path: ssl/mongo-test.csr
    provider: selfsigned
    subject_alt_name: 
      - IP:10.136.31.37
      - IP:10.136.29.52
      - IP:10.136.30.53

如何让我的所有库存 ips 进入 subject_alt_name 列表?

我尝试过使用 with_items,但这会为每个 IP 地址创建一个新证书,并且每次迭代都会覆盖最后一次。

【问题讨论】:

  • 制作 IP 列表(参见 extract 过滤器),在每个元素前面加上 IP:(参见 this
  • 感谢领导,我想我可以解决这个问题。

标签: ssl ansible ansible-inventory


【解决方案1】:

我知道我没有直接回答你的问题,但我遇到了同样的问题,我选择了另一种方法,希望它也适用于你。

我创建了一个使用Jinja 模板化的openssl.conf 文件:

[ req ]
prompt = no
distinguished_name = req_distinguished_name
{% if letsencrypt_sans_domains[item] is defined and letsencrypt_sans_domains[item] | length > 0 %}
req_extensions     = req_ext
{% endif %}

string_mask = utf8only
default_md = sha256

[ req_distinguished_name ]
O=Organization
L=Boston
ST=Massachusetts
C=US
CN={{ item }}

{% if letsencrypt_sans_domains[item] is defined and letsencrypt_sans_domains[item] | length > 0 %}
[ req_ext ]
subjectAltName          = @alt_names

[alt_names]
DNS.1 = {{ item }}
{% set i = 2 %}
{% for domain in letsencrypt_sans_domains[item] %}
DNS.{{ i }} = {{ domain }}
{% set i = i + 1 %}
{% endfor %}
{% endif %}

然后我使用template 模块部署文件并调用:

- name: "Generate CSR"
  command: "openssl req -config openssl_req_{{ item }}.conf -nodes -new -newkey rsa:4096 -out {{ item }}.csr -keyout {{ item }}.key"
  with_items: "{{ letsencrypt_domains | default([]) }}"

变量letsencrypt_sans_domainsletsencrypt_domains指向:

letsencrypt_domains: [
  "a.b.com"
],
letsencrypt_sans_domains: {
  "a.b.com": [ "b.b.com", "c.b.com", "d.b.com" ]
}

}

当然,如果 letsencrypt 是您的用例,您需要回答所有 SAN 域的挑战

【讨论】:

  • 感谢分享,我的用例正在为 mongo 生成证书,但这可能会为我解决这个问题。
  • 是的,不用担心。如果您想了解更多信息,您有很多关于如何使用 openssl 的资源,因为模板可以根据您的需要进行更改。
【解决方案2】:

这可以通过

   - name: Generate an OpenSSL CSR with subjectAltName extension with dynamic list
      openssl_csr:
        path: /etc/ssl/csr/www.ansible.com.csr
        privatekey_path: /etc/ssl/private/ansible.com.pem
        subject_alt_name: "{{ item.value | map('regex_replace', '^', 'IP:') | list }}"
      with_dict:
        ips:
        - 10.10.0.11
        - 10.10.0.12
        - 10.10.0.13

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2012-02-03
    • 2020-10-03
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多