Add letsencrypt documentation
Add an overview of Let's Encrypt operation, and details of requesting a certificate for hosts. Change-Id: I636dbeb60383edd79f8d852c52272f6a79043154
This commit is contained in:
parent
aeefe544e2
commit
6b22833765
133
doc/source/letsencrypt.rst
Normal file
133
doc/source/letsencrypt.rst
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
:title: letsencrypt
|
||||||
|
|
||||||
|
.. _letsencrypt:
|
||||||
|
|
||||||
|
Let's Encrypt Certificates
|
||||||
|
##########################
|
||||||
|
|
||||||
|
We support provisioning certificates from https://letsencrypt.org for
|
||||||
|
hosts in the ``opendev.org`` namespace.
|
||||||
|
|
||||||
|
At a Glance
|
||||||
|
===========
|
||||||
|
|
||||||
|
:Ansible:
|
||||||
|
* :git_file:`playbooks/service-letsencrypt.yaml`
|
||||||
|
* :git_file:`playbooks/roles/letsencrypt-acme-sh-install`
|
||||||
|
* :git_file:`playbooks/roles/letsencrypt-request-certs`
|
||||||
|
* :git_file:`playbooks/roles/letsencrypt-install-txt-record`
|
||||||
|
* :git_file:`playbooks/roles/letsecnrypt-create-certs`
|
||||||
|
:Resources:
|
||||||
|
* https://letsencrypt.org
|
||||||
|
* https://github.com/Neilpang/acme.sh
|
||||||
|
:Chat:
|
||||||
|
* #openstack-infra on freenode
|
||||||
|
|
||||||
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
We support automatic provisioning of certificates from Let's Encrypt
|
||||||
|
to hosts in the ``opendev.org`` domain.
|
||||||
|
|
||||||
|
This is implemented in OpenDev via the roles driven from
|
||||||
|
:git_file:``playbooks/roles/service-letsencrypt.yaml``. The overall
|
||||||
|
actions implemented by the above roles are roughly:
|
||||||
|
|
||||||
|
* Hosts that want a certificate use the ``amce.sh`` tool to request it
|
||||||
|
from the Let's Encrypt CA.
|
||||||
|
|
||||||
|
Creation or renewal requests receive a TXT record authentication
|
||||||
|
value that must be published to prove ownership of the domain. We
|
||||||
|
implement this by making the challenge-request hostname
|
||||||
|
``_acme-challenge.hostname.opendev.org`` a ``CNAME`` record to a
|
||||||
|
special "signing domain" ``acme.opendev.org``.
|
||||||
|
|
||||||
|
Note if valid certificates are present and they are not within the
|
||||||
|
renewal period (which is most of the time) no further action is
|
||||||
|
taken.
|
||||||
|
|
||||||
|
* The provided TXT record authentication values are installed and
|
||||||
|
published to the ``acme.opendev.org`` domain via the OpenDev
|
||||||
|
nameservers.
|
||||||
|
|
||||||
|
* The host can now finalise certificate creation. Let's Encrypt
|
||||||
|
checks ``_acme-chellenge.hostname.opendev.org``, which is a
|
||||||
|
``CNAME`` to ``acme.opendev.org``. Let's Encrypt then enumerates
|
||||||
|
the TXT records there, and once finding the required key will return
|
||||||
|
the signed keys to the host, which saves them to disk.
|
||||||
|
|
||||||
|
|
||||||
|
Configuring a host to get certificates
|
||||||
|
======================================
|
||||||
|
|
||||||
|
A basic configuration consists of the following steps:
|
||||||
|
|
||||||
|
1. Ensure the host is matched by the ``letsencrypt`` group in
|
||||||
|
``inventory/groups.yaml``.
|
||||||
|
#. DNS entries for ``_acme-chellenge.hostname`` as a ``CNAME`` to
|
||||||
|
``opendev.org`` must be added and live in the ``opendev.org``
|
||||||
|
`zone.db
|
||||||
|
<https://opendev.org/opendev/zone-opendev.org/src/branch/master/zones/opendev.org/zone.db>`__
|
||||||
|
file. Follow the other examples to ensure other fields such as
|
||||||
|
``CAA`` records are set too.
|
||||||
|
|
||||||
|
Take care to list `all` hostnames that you wish covered by the
|
||||||
|
certificate (e.g. ``hostname01.opendev.org`` and
|
||||||
|
``hostname.opendev.org``)
|
||||||
|
#. Configure the certificates to be issued to the host.
|
||||||
|
|
||||||
|
The roles look for certificate configuration in a
|
||||||
|
``letsencrypt_certs`` variable defined for each host. This is
|
||||||
|
usually done via specific host variables in
|
||||||
|
``playbooks/host_vars/<hostname>.opendev.org.yaml``. For a simple
|
||||||
|
host that wants a single certificate to cover its numeric hostname
|
||||||
|
and regular ``CNAME`` this would look like ::
|
||||||
|
|
||||||
|
letsencrypt_certs:
|
||||||
|
hostname01-opendev-org:
|
||||||
|
- hostname01.opendev.org
|
||||||
|
- hostname.opendev.org
|
||||||
|
|
||||||
|
This will result in certificate material in
|
||||||
|
``/etc/letsencrypt-certs/hostname01.opendev.org/`` on the host.
|
||||||
|
|
||||||
|
Note that the "certificate name" dictionary keys (just
|
||||||
|
``hostname01-opendev-org`` above) are essentially a free-form
|
||||||
|
string, but are used in the next step. Follow the naming
|
||||||
|
conventions for similar hosts.
|
||||||
|
|
||||||
|
For full details, including information on issuing multiple
|
||||||
|
certificates for a single host, see
|
||||||
|
:git_file:`playbooks/roles/letsencrypt-request-certs/README.rst`.
|
||||||
|
#. Define a handler for certificate creation and renewal actions.
|
||||||
|
|
||||||
|
When the certificate is created or renewed, the
|
||||||
|
``letsencrypt-create-certs`` role calls a predefined handler so
|
||||||
|
action can be taken. This handler name is constructed by
|
||||||
|
prepending ``letsencrypt updated`` to the certificate name above.
|
||||||
|
Thus in this example it would be ::
|
||||||
|
|
||||||
|
- name: letsencrypt updated hostname01-opendev-org
|
||||||
|
...
|
||||||
|
|
||||||
|
Usually these handlers are defined centrally in
|
||||||
|
:git_file:``playbooks/roles/letsencrypt-create-certs/handlers/main.yaml``
|
||||||
|
and common tasks such as restarting Apache have pre-defined tasks
|
||||||
|
available for easy import.
|
||||||
|
|
||||||
|
You may choose to define the handler in another way, but it *must*
|
||||||
|
exist (Ansible does not have a way to say "call this handler only
|
||||||
|
if it exists", thus a missing handler will cause an Ansible error
|
||||||
|
at runtime).
|
||||||
|
|
||||||
|
Debugging
|
||||||
|
=========
|
||||||
|
|
||||||
|
The Ansible run logs on ``bridge.opendev.org`` should be consulted if
|
||||||
|
the certificate material is not being created as expected.
|
||||||
|
|
||||||
|
Hosts will log their ``acme.sh`` output to
|
||||||
|
``/var/log/acme.sh/acme.sh.log``
|
||||||
|
|
||||||
|
The `G Suite Toolbox Dig <https://toolbox.googleapps.com/apps/dig/>`__
|
||||||
|
tool can be useful for checking DNS entries from a remote location.
|
@ -45,3 +45,4 @@ Major Systems
|
|||||||
activity
|
activity
|
||||||
asterisk
|
asterisk
|
||||||
survey
|
survey
|
||||||
|
letsencrypt
|
||||||
|
Loading…
x
Reference in New Issue
Block a user