@@ -0,0 +1,4 @@ | |||||
certificate_authority_private_key_size: 4096 | |||||
certificate_authority_subject: "{% if certificate_authority_country is defined%}/C={{certificate_authority_country}}{% endif %}{% if certificate_authority_state is defined%}/ST={{certificate_authority_state}}{% endif %}{% if certificate_authority_locality is defined%}/L={{certificate_authority_locality}}{% endif %}{% if certificate_authority_organization is defined%}/O={{certificate_authority_organization}}{% endif %}{% if certificate_authority_organizational_unit is defined%}/OU={{certificate_authority_organizational_unit}}{% endif %}/CN={{certificate_authority_common_name}}" | |||||
certificate_authority_policy: strict | |||||
certificate_authority_unique_subject: no |
@@ -0,0 +1,98 @@ | |||||
--- | |||||
# https://jamielinux.com/docs/openssl-certificate-authority/create-the-root-pair.html | |||||
- name: directory | |||||
file: | |||||
path: "{{ certificate_authority_directory }}" | |||||
#mode: 0700 | |||||
state: directory | |||||
- name: subdirectories | |||||
file: | |||||
path: "{{ certificate_authority_directory }}/{{ item }}" | |||||
#mode: 0700 | |||||
state: directory | |||||
with_items: | |||||
- certs | |||||
- crl | |||||
- csr | |||||
- newcerts | |||||
- name: private directory | |||||
file: | |||||
path: "{{ certificate_authority_directory }}/private" | |||||
mode: 0700 | |||||
state: directory | |||||
- name: private key | |||||
command: | |||||
openssl genrsa | |||||
-out private/ca.key.pem {{ certificate_authority_private_key_size }} | |||||
args: | |||||
chdir: "{{ certificate_authority_directory }}" | |||||
creates: "{{ certificate_authority_directory }}/private/ca.key.pem" | |||||
- name: openssl config | |||||
template: | |||||
src: openssl.cnf.j2 | |||||
dest: "{{ certificate_authority_directory }}/openssl.cnf" | |||||
- name: extensions config | |||||
template: | |||||
src: extensions.cnf.j2 | |||||
dest: "{{ certificate_authority_directory }}/extensions.cnf" | |||||
- name: index config | |||||
template: | |||||
src: index.attr.j2 | |||||
dest: "{{ certificate_authority_directory }}/index.attr" | |||||
- name: index | |||||
copy: | |||||
content: "" | |||||
dest: "{{ certificate_authority_directory }}/index" | |||||
force: no | |||||
- name: serial | |||||
copy: | |||||
content: "00\n" | |||||
dest: "{{ certificate_authority_directory }}/serial" | |||||
force: no | |||||
- name: certificate signing request | |||||
command: openssl req -new | |||||
-config openssl.cnf | |||||
-key private/ca.key.pem | |||||
-days {{ certificate_authority_days }} | |||||
-sha256 | |||||
-out csr/ca.csr.pem | |||||
-subj "{{ certificate_authority_subject }}" | |||||
args: | |||||
chdir: "{{ certificate_authority_directory }}" | |||||
creates: "{{ certificate_authority_directory }}/csr/ca.csr.pem" | |||||
#when: certificate_authority_type == "intermediate" | |||||
- name: self sign certificate | |||||
command: openssl ca -selfsign -batch | |||||
-config openssl.cnf | |||||
-days {{ certificate_authority_days }} | |||||
-extensions certificate_authority | |||||
-in csr/ca.csr.pem | |||||
-out certs/ca.cert.pem | |||||
-subj "{{ certificate_authority_subject }}" | |||||
args: | |||||
chdir: "{{ certificate_authority_directory }}" | |||||
creates: "{{ certificate_authority_directory }}/certs/ca.cert.pem" | |||||
when: certificate_authority_type == "root" | |||||
- name: certificate info | |||||
command: openssl x509 -text -noout -in certs/ca.cert.pem | |||||
args: | |||||
chdir: "{{ certificate_authority_directory }}" | |||||
changed_when: false | |||||
register: _certificate_authority_info | |||||
- name: show certificate info | |||||
debug: | |||||
msg: "{{ _certificate_authority_info }}" |
@@ -0,0 +1,6 @@ | |||||
[ | |||||
"CA:TRUE", | |||||
{% if certificate_authority_pathlen is defined %} | |||||
"pathlen:{{certificate_authority_pathlen}}", | |||||
{% endif %} | |||||
] |
@@ -0,0 +1,9 @@ | |||||
[ certificate_authority ] | |||||
# Extensions for a typical CA (`man x509v3_config`). | |||||
subjectKeyIdentifier = hash | |||||
authorityKeyIdentifier = keyid:always,issuer | |||||
basicConstraints = critical, {{ certificate_authority_basic_constraints | join(', ') }} | |||||
keyUsage = critical, digitalSignature, cRLSign, keyCertSign | |||||
{% if certificate_authority_name_constraints is defined %} | |||||
nameConstraints = critical, {{ certificate_authority_name_constraints | join(',') }} | |||||
{% endif %} |
@@ -0,0 +1 @@ | |||||
unique_subject = {{ certificate_authority_unique_subject | ternary('yes','no') }} |
@@ -0,0 +1,127 @@ | |||||
[ ca ] | |||||
# `man ca` | |||||
default_ca = CA_default | |||||
[ CA_default ] | |||||
# Directory and file locations. | |||||
dir = {{ certificate_authority_directory }} | |||||
certs = $dir/certs | |||||
crl_dir = $dir/crl | |||||
new_certs_dir = $dir/newcerts | |||||
database = $dir/index | |||||
serial = $dir/serial | |||||
RANDFILE = $dir/private/.rand | |||||
# The root key and root certificate. | |||||
private_key = $dir/private/ca.key.pem | |||||
certificate = $dir/certs/ca.cert.pem | |||||
# For certificate revocation lists. | |||||
crlnumber = $dir/crlnumber | |||||
crl = $dir/crl/ca.crl.pem | |||||
crl_extensions = crl_ext | |||||
default_crl_days = 30 | |||||
# SHA-1 is deprecated, so use SHA-2 instead. | |||||
default_md = sha256 | |||||
name_opt = ca_default | |||||
cert_opt = ca_default | |||||
default_days = 375 | |||||
preserve = no | |||||
policy = policy_{{ certificate_authority_policy }} | |||||
[ policy_strict ] | |||||
# The root CA should only sign intermediate certificates that match. | |||||
# See the POLICY FORMAT section of `man ca`. | |||||
countryName = match | |||||
stateOrProvinceName = match | |||||
organizationName = match | |||||
organizationalUnitName = optional | |||||
commonName = supplied | |||||
emailAddress = optional | |||||
[ policy_strict_org ] | |||||
# The root CA should only sign intermediate certificates that match. | |||||
# See the POLICY FORMAT section of `man ca`. | |||||
countryName = optional | |||||
stateOrProvinceName = optional | |||||
organizationName = match | |||||
organizationalUnitName = optional | |||||
commonName = supplied | |||||
emailAddress = optional | |||||
[ policy_loose ] | |||||
# Allow the intermediate CA to sign a more diverse range of certificates. | |||||
# See the POLICY FORMAT section of the `ca` man page. | |||||
countryName = optional | |||||
stateOrProvinceName = optional | |||||
localityName = optional | |||||
organizationName = optional | |||||
organizationalUnitName = optional | |||||
commonName = supplied | |||||
emailAddress = optional | |||||
[ req ] | |||||
# Options for the `req` tool (`man req`). | |||||
default_bits = 2048 | |||||
distinguished_name = req_distinguished_name | |||||
string_mask = utf8only | |||||
# SHA-1 is deprecated, so use SHA-2 instead. | |||||
default_md = sha256 | |||||
# Extension to add when the -x509 option is used. | |||||
#x509_extensions = v3_ca | |||||
[ req_distinguished_name ] | |||||
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>. | |||||
countryName = Country Name (2 letter code) | |||||
stateOrProvinceName = State or Province Name | |||||
localityName = Locality Name | |||||
0.organizationName = Organization Name | |||||
organizationalUnitName = Organizational Unit Name | |||||
commonName = Common Name | |||||
emailAddress = Email Address | |||||
# Optionally, specify some defaults. | |||||
countryName_default = {{ certificate_authority_country | default('') }} | |||||
stateOrProvinceName_default = {{ certificate_authority_state | default('') }} | |||||
localityName_default = {{ certificate_authority_locality | default('') }} | |||||
0.organizationName_default = {{ certificate_authority_organization | default('') }} | |||||
organizationalUnitName_default = {{ certificate_authority_organizational_unit | default('') }} | |||||
#emailAddress_default = | |||||
{% include "extensions.cnf.j2" %} | |||||
[ usr_cert ] | |||||
# Extensions for client certificates (`man x509v3_config`). | |||||
basicConstraints = CA:FALSE | |||||
nsCertType = client, email | |||||
nsComment = "OpenSSL Generated Client Certificate" | |||||
subjectKeyIdentifier = hash | |||||
authorityKeyIdentifier = keyid,issuer | |||||
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment | |||||
extendedKeyUsage = clientAuth, emailProtection | |||||
[ server_cert ] | |||||
# Extensions for server certificates (`man x509v3_config`). | |||||
basicConstraints = CA:FALSE | |||||
nsCertType = server | |||||
nsComment = "OpenSSL Generated Server Certificate" | |||||
subjectKeyIdentifier = hash | |||||
authorityKeyIdentifier = keyid,issuer:always | |||||
keyUsage = critical, digitalSignature, keyEncipherment | |||||
extendedKeyUsage = serverAuth | |||||
[ crl_ext ] | |||||
# Extension for CRLs (`man x509v3_config`). | |||||
authorityKeyIdentifier=keyid:always | |||||
[ ocsp ] | |||||
# Extension for OCSP signing certificates (`man ocsp`). | |||||
basicConstraints = CA:FALSE | |||||
subjectKeyIdentifier = hash | |||||
authorityKeyIdentifier = keyid,issuer | |||||
keyUsage = critical, digitalSignature | |||||
extendedKeyUsage = critical, OCSPSigning |
@@ -0,0 +1 @@ | |||||
certificate_authority_basic_constraints: "{{ lookup('template','basic_constraints.json.j2') }}" |