From f0718f3ceceec13a03b54b8d6d0abd2dac929fc3 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 20 Dec 2023 11:53:07 +0100 Subject: x509: add new role managed-ca --- roles/x509/managed-ca/cert/prepare/tasks/main.yml | 123 ++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 roles/x509/managed-ca/cert/prepare/tasks/main.yml (limited to 'roles/x509/managed-ca/cert/prepare/tasks/main.yml') diff --git a/roles/x509/managed-ca/cert/prepare/tasks/main.yml b/roles/x509/managed-ca/cert/prepare/tasks/main.yml new file mode 100644 index 00000000..97292b04 --- /dev/null +++ b/roles/x509/managed-ca/cert/prepare/tasks/main.yml @@ -0,0 +1,123 @@ +--- +- name: compute path to managed-ca certificate directory + set_fact: + managed_ca_cert_path: "{{ managed_ca_cert_config.path | default([managed_ca_cert_base_dir, managed_ca_cert_name] | path_join) }}" + +- name: create directory for managed-ca certificate + file: + path: "{{ managed_ca_cert_path }}" + state: directory + mode: "{{ managed_ca_cert_config.mode | default('0700') }}" + owner: "{{ managed_ca_cert_config.owner | default(omit) }}" + group: "{{ managed_ca_cert_config.group | default(omit) }}" + notify: + - reload services for x509 certificates + - restart services for x509 certificates + +- name: generate key for managed-ca certificate + openssl_privatekey: + path: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-key.pem" + mode: "{{ managed_ca_cert_config.key.mode | default('0600') }}" + owner: "{{ managed_ca_cert_config.key.owner | default(omit) }}" + group: "{{ managed_ca_cert_config.key.group | default(omit) }}" + type: "{{ managed_ca_cert_config.key.type | default(omit) }}" + size: "{{ managed_ca_cert_config.key.size | default(omit) }}" + notify: + - reload services for x509 certificates + - restart services for x509 certificates + register: _managed_ca_key_ + +- name: generate csr for managed-ca certificate + community.crypto.openssl_csr: + path: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-csr.pem" + mode: "{{ managed_ca_cert_config.cert.mode | default('0644') }}" + owner: "{{ managed_ca_cert_config.cert.owner | default(omit) }}" + group: "{{ managed_ca_cert_config.cert.group | default(omit) }}" + privatekey_path: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-key.pem" + create_subject_key_identifier: "{{ managed_ca_cert_config.cert.create_subject_key_identifier | default(omit) }}" + digest: "{{ managed_ca_cert_config.cert.digest | default(omit) }}" + common_name: "{{ managed_ca_cert_config.cert.common_name | default(managed_ca_cert_name) }}" + subject_alt_name: "{{ ['DNS:'] | product(managed_ca_cert_hostnames) | map('join') | union(managed_ca_cert_config.cert.san_extra | default([])) | list }}" + subject_alt_name_critical: yes + use_common_name_for_san: no + country_name: "{{ managed_ca_cert_config.cert.country_name | default(omit) }}" + locality_name: "{{ managed_ca_cert_config.cert.locality_name | default(omit) }}" + organization_name: "{{ managed_ca_cert_config.cert.organization_name | default(omit) }}" + organizational_unit_name: "{{ managed_ca_cert_config.cert.organizational_unit_name | default(omit) }}" + state_or_province_name: "{{ managed_ca_cert_config.cert.state_or_province_name | default(omit) }}" + basic_constraints: "{{ managed_ca_cert_config.cert.basic_constraints | default(omit) }}" + basic_constraints_critical: "{{ managed_ca_cert_config.cert.basic_constraints_critical | default(omit) }}" + key_usage: "{{ managed_ca_cert_config.cert.key_usage | default(omit) }}" + key_usage_critical: "{{ managed_ca_cert_config.cert.key_usage_critical | default(omit) }}" + extended_key_usage: "{{ managed_ca_cert_config.cert.extended_key_usage | default(omit) }}" + extended_key_usage_critical: "{{ managed_ca_cert_config.cert.extended_key_usage_critical | default(omit) }}" + +- name: slurp csr for managed-ca certificate + slurp: + src: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-csr.pem" + register: _managed_ca_csr_ + +- name: check if managed-ca certificate already exists + stat: + path: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-crt.pem" + register: _managed_ca_cert_file_ + +- name: check validity of existing managed-ca certificate + when: _managed_ca_cert_file_.stat.exists + openssl_certificate_info: + path: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-crt.pem" + valid_at: + renew_margin: "{{ managed_ca_cert_config.cert.renew_margin | default(managed_ca_cert_default_renew_margin) }}" + register: _managed_ca_cert_info_ + +- name: slurp existing existing managed-ca certificate + when: _managed_ca_cert_file_.stat.exists + slurp: + src: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-crt.pem" + register: _managed_ca_cert_current_ + +- name: generate managed-ca certificate + delegate_to: "{{ managed_ca_cert_config.ca.host }}" + community.crypto.x509_certificate_pipe: + content: "{{ _managed_ca_cert_current_.content | default('') | b64decode }}" + csr_content: "{{ _managed_ca_csr_.content | b64decode }}" + provider: ownca + ownca_path: "/etc/ssl/managed-ca/{{ managed_ca_cert_config.ca.name }}/crt.pem" + ownca_privatekey_path: "/etc/ssl/managed-ca/{{ managed_ca_cert_config.ca.name }}/key.pem" + ownca_digest: "{{ managed_ca_cert_config.cert.digest | default(omit) }}" + ownca_not_before: "{{ managed_ca_cert_config.cert.not_before | default(omit) }}" + ownca_not_after: "{{ managed_ca_cert_config.cert.not_after | default(omit) }}" + force: "{{ _managed_ca_cert_file_.stat.exists and (not _managed_ca_cert_info_.valid_at.renew_margin) }}" + register: _managed_ca_cert_new_ + +- name: store managed-ca certificate + copy: + content: "{{ _managed_ca_cert_new_.certificate }}" + dest: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-crt.pem" + mode: "{{ managed_ca_cert_config.cert.mode | default('0644') }}" + owner: "{{ managed_ca_cert_config.cert.owner | default(omit) }}" + group: "{{ managed_ca_cert_config.cert.group | default(omit) }}" + register: _managed_ca_cert_ + notify: + - reload services for x509 certificates + - restart services for x509 certificates + +- name: export paths to certificate files + set_fact: + x509_certificate_path_key: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-key.pem" + x509_certificate_path_cert: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-crt.pem" + x509_certificate_path_chain: "" + x509_certificate_path_fullchain: "{{ managed_ca_cert_path }}/{{ managed_ca_cert_name }}-crt.pem" + +- name: generate custom post-renewal script + when: x509_certificate_renewal is defined + template: + src: updated.sh.j2 + dest: "{{ managed_ca_cert_path }}/updated.sh" + mode: 0755 + +- name: call custom post-renewal script + when: + - x509_certificate_renewal is defined + - (_managed_ca_key_ is changed) or (_managed_ca_cert_ is changed) + command: "{{ managed_ca_cert_path }}/updated.sh" -- cgit v1.2.3