Skip to content

Commit d9a82a0

Browse files
committed
Refactor certificates role to normalize server and client certificate creation
Signed-off-by: Eric D. Helms <ericdhelms@gmail.com>
1 parent 726e4a5 commit d9a82a0

File tree

9 files changed

+206
-204
lines changed

9 files changed

+206
-204
lines changed

playbooks/deploy.yaml

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,38 @@
33
hosts:
44
- quadlet
55
become: true
6+
vars_files:
7+
- "../vars/{{ certificate_source | default('default') }}_certificates.yml"
68
vars:
79
certificates_hostnames:
10+
- "{{ ansible_fqdn }}"
811
- localhost
912
certificates_ca_password: "CHANGEME"
1013
candlepin_db_password: "CHANGEME"
1114
candlepin_keystore_password: "CHANGEME"
1215
candlepin_oauth_secret: "CHANGEME"
13-
candlepin_ca_key: "{{ certificates_ca_directory }}/private/ca.key"
14-
candlepin_ca_key_password: "{{ certificates_ca_directory }}/private/ca.pwd"
15-
candlepin_ca_certificate: "{{ certificates_ca_directory }}/certs/ca.crt"
16-
candlepin_tomcat_key: "{{ certificates_ca_directory }}/private/localhost.key"
17-
candlepin_tomcat_certificate: "{{ certificates_ca_directory }}/certs/localhost.crt"
18-
candlepin_client_key: "{{ certificates_ca_directory }}/private/{{ certificates_server }}-client.key"
19-
candlepin_client_certificate: "{{ certificates_ca_directory }}/certs/{{ certificates_server }}-client.crt"
20-
foreman_proxy_ca_certificate: "{{ certificates_ca_directory }}/certs/ca.crt"
21-
foreman_proxy_server_key: "{{ certificates_ca_directory }}/private/{{ certificates_server }}.key"
22-
foreman_proxy_server_certificate: "{{ certificates_ca_directory }}/certs/{{ certificates_server }}.crt"
23-
foreman_proxy_client_key: "{{ certificates_ca_directory }}/private/{{ certificates_server }}-client.key"
24-
foreman_proxy_client_certificate: "{{ certificates_ca_directory }}/certs/{{ certificates_server }}-client.crt"
25-
foreman_ca_certificate: "{{ certificates_ca_directory }}/certs/ca.crt"
26-
foreman_client_key: "{{ certificates_ca_directory }}/private/{{ certificates_server }}-client.key"
27-
foreman_client_certificate: "{{ certificates_ca_directory }}/certs/{{ certificates_server }}-client.crt"
16+
candlepin_ca_key_password: "{{ ca_key_password }}"
17+
candlepin_ca_key: "{{ ca_key }}"
18+
candlepin_ca_certificate: "{{ ca_certificate }}"
19+
candlepin_tomcat_key: "{{ localhost_key }}"
20+
candlepin_tomcat_certificate: "{{ localhost_certificate }}"
21+
candlepin_client_key: "{{ client_key }}"
22+
candlepin_client_certificate: "{{ client_certificate }}"
23+
foreman_proxy_ca_certificate: "{{ ca_certificate }}"
24+
foreman_proxy_server_key: "{{ server_key }}"
25+
foreman_proxy_server_certificate: "{{ server_certificate }}"
26+
foreman_proxy_client_key: "{{ client_key }}"
27+
foreman_proxy_client_certificate: "{{ client_certificate }}"
28+
foreman_ca_certificate: "{{ ca_certificate }}"
29+
foreman_client_key: "{{ client_key }}"
30+
foreman_client_certificate: "{{ client_certificate }}"
2831
foreman_db_password: "CHANGEME"
2932
foreman_oauth_consumer_key: abcdefghijklmnopqrstuvwxyz123456
3033
foreman_oauth_consumer_secret: abcdefghijklmnopqrstuvwxyz123456
31-
httpd_server_ca_certificate: "{{ certificates_ca_directory }}/certs/ca.crt"
32-
httpd_client_ca_certificate: "{{ certificates_ca_directory }}/certs/ca.crt"
33-
httpd_server_certificate: "{{ certificates_ca_directory }}/certs/{{ certificates_server }}.crt"
34-
httpd_server_key: "{{ certificates_ca_directory }}/private/{{ certificates_server }}.key"
34+
httpd_server_ca_certificate: "{{ ca_certificate }}"
35+
httpd_client_ca_certificate: "{{ ca_certificate }}"
36+
httpd_server_certificate: "{{ server_certificate }}"
37+
httpd_server_key: "{{ server_key }}"
3538
pulp_db_password: "CHANGEME"
3639
pulp_content_origin: "https://{{ ansible_fqdn }}"
3740
postgresql_databases:
@@ -56,7 +59,13 @@
5659
- { type: host, database: all, user: all, address: '127.0.0.1/32', auth_method: md5 }
5760
- { type: host, database: all, user: all, address: '::1/128', auth_method: md5 }
5861
roles:
59-
- certificates
62+
- role: certificates
63+
when: "certificate_source | default('default') == 'default'"
64+
- role: certificate_checks
65+
vars:
66+
certificate_checks_certificate: "{{ server_certificate }}"
67+
certificate_checks_key: "{{ server_key }}"
68+
certificate_checks_ca: "{{ ca_certificate }}"
6069
- geerlingguy.postgresql
6170
- redis
6271
- candlepin
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
- name: Fetch katello_certs_check
3+
ansible.builtin.get_url:
4+
url: https://raw.githubusercontent.com/theforeman/foreman-installer/refs/heads/develop/bin/katello-certs-check
5+
dest: /usr/bin/katello-certs-check
6+
mode: '0744'
7+
8+
- name: Check certificates
9+
ansible.builtin.command:
10+
argv:
11+
- "/usr/bin/katello-certs-check"
12+
- "-t"
13+
- "foreman"
14+
- "-c"
15+
- "{{ certificate_checks_certificate }}"
16+
- "-k"
17+
- "{{ certificate_checks_key }}"
18+
- "-b"
19+
- "{{ certificate_checks_ca }}"
20+
changed_when: false
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
---
2+
certificates_ca: true
23
certificates_ca_directory: /root/certificates # Change this to /var/lib?
34
certificates_ca_directory_keys: "{{ certificates_ca_directory }}/private"
45
certificates_ca_directory_certs: "{{ certificates_ca_directory }}/certs"
56
certificates_ca_directory_requests: "{{ certificates_ca_directory }}/requests"
6-
certificates_server: "{{ ansible_fqdn }}"
7-
certificates_client: "{{ ansible_fqdn }}-client"

roles/certificates/tasks/ca.yml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
- name: 'Install openssl'
3+
ansible.builtin.package:
4+
name: openssl
5+
state: present
6+
7+
- name: 'Create certs directory'
8+
ansible.builtin.file:
9+
path: "{{ certificates_ca_directory_certs }}"
10+
state: directory
11+
mode: '0755'
12+
13+
- name: 'Create keys directory'
14+
ansible.builtin.file:
15+
path: "{{ certificates_ca_directory_keys }}"
16+
state: directory
17+
mode: '0755'
18+
19+
- name: 'Create requests directory'
20+
ansible.builtin.file:
21+
path: "{{ certificates_ca_directory_requests }}"
22+
state: directory
23+
mode: '0755'
24+
25+
- name: 'Deploy configuration file'
26+
ansible.builtin.template:
27+
src: openssl.cnf.j2
28+
dest: "{{ certificates_ca_directory }}/openssl.cnf"
29+
owner: root
30+
group: root
31+
mode: '0644'
32+
33+
- name: 'Create index file'
34+
ansible.builtin.file:
35+
path: "{{ certificates_ca_directory }}/index.txt"
36+
state: touch
37+
owner: root
38+
group: root
39+
mode: '0644'
40+
41+
- name: 'Ensure serial starting number'
42+
ansible.builtin.template:
43+
src: serial.j2
44+
dest: "{{ certificates_ca_directory }}/serial"
45+
force: false
46+
owner: root
47+
group: root
48+
mode: '0644'
49+
50+
- name: 'Create CA key password file'
51+
ansible.builtin.copy:
52+
content: "{{ certificates_ca_password }}"
53+
dest: "{{ certificates_ca_directory_keys }}/ca.pwd"
54+
owner: root
55+
group: root
56+
mode: '0600'
57+
no_log: true
58+
59+
- name: 'Creating CA certificate and key'
60+
ansible.builtin.command: >
61+
openssl req -new
62+
-x509
63+
-nodes
64+
-extensions v3_ca
65+
-config "{{ certificates_ca_directory }}/openssl.cnf"
66+
-subj "/CN=Foreman Self-signed CA"
67+
-keyout "{{ certificates_ca_directory_keys }}/ca.key"
68+
-out "{{ certificates_ca_directory_certs }}/ca.crt"
69+
-passout "file:{{ certificates_ca_directory_keys }}/ca.pwd"
70+
args:
71+
creates: "{{ certificates_ca_directory_certs }}/ca.crt"

roles/certificates/tasks/issue.yml

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,66 @@
11
---
2-
- name: 'Creating signing request'
2+
- name: 'Create server key'
33
ansible.builtin.command: >
4-
openssl req -new
5-
-newkey rsa:2048
6-
-nodes
7-
-out "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}.csr"
8-
-keyout "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}.key"
9-
-subj "/C=US/ST=North Carolina/L=Raleigh/O=Foreman/OU=Katello/CN={{ certificates_hostname }}"
4+
openssl genrsa
5+
-out "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}.key"
6+
4096
7+
args:
8+
creates: "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}.key"
9+
10+
- name: 'Creating server signing request'
11+
ansible.builtin.command: >
12+
openssl req
13+
-new
14+
-config "{{ certificates_ca_directory }}/openssl.cnf"
15+
-key "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}.key"
16+
-subj "/CN={{ certificates_hostname }}"
17+
-addext "subjectAltName = DNS:{{ certificates_hostname }}"
18+
-out "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}.csr"
1019
args:
1120
creates: "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}.csr"
1221

13-
- name: 'Sign signing request'
22+
- name: 'Sign server signing request'
1423
ansible.builtin.command: >
15-
openssl ca
16-
-config "{{ certificates_ca_directory }}/openssl.cnf"
17-
-batch
18-
-policy signing_policy
19-
-extensions signing_req
20-
-passin "file:{{ certificates_ca_directory_keys }}/ca.pwd"
21-
-out "{{ certificates_ca_directory_certs }}/{{ certificates_hostname }}.crt"
22-
-infiles "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}.csr"
24+
openssl ca
25+
-create_serial
26+
-batch
27+
-extensions ssl_server
28+
-config "{{ certificates_ca_directory }}/openssl.cnf"
29+
-passin "file:{{ certificates_ca_directory_keys }}/ca.pwd"
30+
-in "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}.csr"
31+
-out "{{ certificates_ca_directory_certs }}/{{ certificates_hostname }}.crt"
2332
args:
2433
creates: "{{ certificates_ca_directory_certs }}/{{ certificates_hostname }}.crt"
34+
35+
- name: 'Create client key'
36+
ansible.builtin.command: >
37+
openssl genrsa
38+
-out "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}-client.key"
39+
4096
40+
args:
41+
creates: "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}-client.key"
42+
43+
- name: 'Creating client signing request'
44+
ansible.builtin.command: >
45+
openssl req
46+
-new
47+
-config "{{ certificates_ca_directory }}/openssl.cnf"
48+
-key "{{ certificates_ca_directory_keys }}/{{ certificates_hostname }}-client.key"
49+
-addext "subjectAltName = DNS:{{ certificates_hostname }}"
50+
-subj "/CN={{ certificates_hostname }}"
51+
-out "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}-client.csr"
52+
args:
53+
creates: "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}-client.csr"
54+
55+
- name: 'Sign client signing request'
56+
ansible.builtin.command: >
57+
openssl ca
58+
-create_serial
59+
-batch
60+
-extensions ssl_client
61+
-config "{{ certificates_ca_directory }}/openssl.cnf"
62+
-passin "file:{{ certificates_ca_directory_keys }}/ca.pwd"
63+
-in "{{ certificates_ca_directory_requests }}/{{ certificates_hostname }}-client.csr"
64+
-out "{{ certificates_ca_directory_certs }}/{{ certificates_hostname }}-client.crt"
65+
args:
66+
creates: "{{ certificates_ca_directory_certs }}/{{ certificates_hostname }}-client.crt"

roles/certificates/tasks/main.yml

Lines changed: 3 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,132 +1,7 @@
11
---
2-
- name: 'Install openssl'
3-
ansible.builtin.package:
4-
name: openssl
5-
state: present
6-
7-
- name: 'Create certs directory'
8-
ansible.builtin.file:
9-
path: "{{ certificates_ca_directory_certs }}"
10-
state: directory
11-
mode: '0755'
12-
13-
- name: 'Create keys directory'
14-
ansible.builtin.file:
15-
path: "{{ certificates_ca_directory_keys }}"
16-
state: directory
17-
mode: '0755'
18-
19-
- name: 'Create requests directory'
20-
ansible.builtin.file:
21-
path: "{{ certificates_ca_directory_requests }}"
22-
state: directory
23-
mode: '0755'
24-
25-
- name: 'Deploy configuration file'
26-
ansible.builtin.template:
27-
src: openssl.cnf.j2
28-
dest: "{{ certificates_ca_directory }}/openssl.cnf"
29-
owner: root
30-
group: root
31-
mode: '0644'
32-
33-
- name: 'Create index file'
34-
ansible.builtin.file:
35-
path: "{{ certificates_ca_directory }}/index.txt"
36-
state: touch
37-
owner: root
38-
group: root
39-
mode: '0644'
40-
41-
- name: 'Ensure serial starting number'
42-
ansible.builtin.template:
43-
src: serial.j2
44-
dest: "{{ certificates_ca_directory }}/serial"
45-
force: false
46-
owner: root
47-
group: root
48-
mode: '0644'
49-
50-
- name: 'Create CA key password file'
51-
ansible.builtin.copy:
52-
content: "{{ certificates_ca_password }}"
53-
dest: "{{ certificates_ca_directory_keys }}/ca.pwd"
54-
owner: root
55-
group: root
56-
mode: '0600'
57-
no_log: true
58-
59-
- name: 'Creating CA certificate and key'
60-
ansible.builtin.command: >
61-
openssl req -new
62-
-x509
63-
-extensions v3_ca
64-
-config "{{ certificates_ca_directory }}/openssl.cnf"
65-
-keyout "{{ certificates_ca_directory_keys }}/ca.key"
66-
-out "{{ certificates_ca_directory_certs }}/ca.crt"
67-
-passout "file:{{ certificates_ca_directory_keys }}/ca.pwd"
68-
args:
69-
creates: "{{ certificates_ca_directory_certs }}/ca.crt"
70-
71-
- name: 'Create server key'
72-
ansible.builtin.command: >
73-
openssl genrsa
74-
-out "{{ certificates_ca_directory_keys }}/{{ certificates_server }}.key"
75-
args:
76-
creates: "{{ certificates_ca_directory_keys }}/{{ certificates_server }}.key"
77-
78-
- name: 'Create server signing request'
79-
ansible.builtin.command: >
80-
openssl req
81-
-new
82-
-config "{{ certificates_ca_directory }}/openssl.cnf"
83-
-key "{{ certificates_ca_directory_keys }}/{{ certificates_server }}.key"
84-
-out "{{ certificates_ca_directory_requests }}/{{ certificates_server }}.csr"
85-
args:
86-
creates: "{{ certificates_ca_directory_requests }}/{{ certificates_server }}.csr"
87-
88-
- name: 'Create server certificate'
89-
ansible.builtin.command: >
90-
openssl ca
91-
-create_serial
92-
-batch
93-
-extensions ssl_server
94-
-passin "file:{{ certificates_ca_directory_keys }}/ca.pwd"
95-
-config "{{ certificates_ca_directory }}/openssl.cnf"
96-
-in "{{ certificates_ca_directory_requests }}/{{ certificates_server }}.csr"
97-
-out "{{ certificates_ca_directory_certs }}/{{ certificates_server }}.crt"
98-
args:
99-
creates: "{{ certificates_ca_directory_certs }}/{{ certificates_server }}.crt"
100-
101-
- name: 'Create client key'
102-
ansible.builtin.command: >
103-
openssl genrsa
104-
-out "{{ certificates_ca_directory_keys }}/{{ certificates_client }}.key"
105-
args:
106-
creates: "{{ certificates_ca_directory_keys }}/{{ certificates_client }}.key"
107-
108-
- name: 'Create client signing request'
109-
ansible.builtin.command: >
110-
openssl req
111-
-new
112-
-config "{{ certificates_ca_directory }}/openssl.cnf"
113-
-key "{{ certificates_ca_directory_keys }}/{{ certificates_client }}.key"
114-
-out "{{ certificates_ca_directory_requests }}/{{ certificates_client }}.csr"
115-
args:
116-
creates: "{{ certificates_ca_directory_requests }}/{{ certificates_client }}.csr"
117-
118-
- name: 'Create server certificate'
119-
ansible.builtin.command: >
120-
openssl ca
121-
-create_serial
122-
-batch
123-
-extensions ssl_client
124-
-passin "file:{{ certificates_ca_directory_keys }}/ca.pwd"
125-
-config "{{ certificates_ca_directory }}/openssl.cnf"
126-
-in "{{ certificates_ca_directory_requests }}/{{ certificates_client }}.csr"
127-
-out "{{ certificates_ca_directory_certs }}/{{ certificates_client }}.crt"
128-
args:
129-
creates: "{{ certificates_ca_directory_certs }}/{{ certificates_client }}.crt"
2+
- name: 'Generate CA certificate'
3+
ansible.builtin.include_tasks: ca.yml
4+
when: certificates_ca
1305

1316
- name: 'Issue other certificates'
1327
ansible.builtin.include_tasks: issue.yml

0 commit comments

Comments
 (0)